首页 > 解决方案 > `('a':_)` 代表一个元组还是一个列表?

问题描述

决定列表是否以字母“a”开头的函数可以定义如下:

test :: [Char] -> Bool 
test ['a',_] = True  
test _ = False

或者

test :: [Char] -> Bool 
test ('a':_) = True  
test _ = False

为什么第一次用[],而第二次用()

第二个用于('a':_)表示元组还是列表?

标签: listhaskell

解决方案


第二个用于('a':_)表示元组还是列表?

一份清单

如果一个列表,不代表()一个元组,它怎么能代表一个列表?

不,这是单位类型[wiki]。它不是元组,也不是列表。有时,正如维基百科文章所说,它被解释为 0 元组。它也被定义GHC.Tuple

为什么第一次用[],而第二次用()

两者等价。前者匹配一个只有两个元素的列表,其中第一个元素是 an 'a',而后者匹配一个具有至少一个元素的列表,其中第一个元素是 an 'a'。但是后者可以匹配一个包含一个元素、三个元素等的列表,而前者只能匹配恰好包含两个元素的列表。

背景

(:)是列表的数据构造函数。的确:

Prelude> :i (:)
data [] a = ... | a : [a]   -- Defined in ‘GHC.Types’
infixr 5 :

('a': _)只是 的一种更好的形式((:) 'a' _)。因此,我们在这里使用列表数据构造函数之一。

是的['a', _]语法糖(:) 'a' ((:) _ []),所以这里我们匹配一个以 an 开头的列表,'a'其中尾部是一个列表,头部是我们不关心的值,尾部是空列表数据构造函数


推荐阅读