关于函数中模式匹配的Haskell语法

时间:2014-11-16 23:46:28

标签: function haskell pattern-matching tuples

好的,我正在看这个功能:

myLength :: [a] -> Int
myLength [] = 0
myLength (x:xs) = 1 + myLength xs

但我最困惑的是最后一行。这部分特别是:(x:xs)

实现这个时,我使用了方括号,因为我认为它是一个列表,我将它的第一个元素与其余元素分开。它是如何成为元组的?

第二行和第三行之间似乎有点不匹配。为什么这可能是一个空数组,但下一行是一个元组?这就是我最初的想法,并认为它最有意义,但它会引发错误。

myLength :: [a] -> Int
myLength [] = 0
myLength [x:xs] = 1 + myLength xs

我怎么知道何时使用括号以及何时使用方括号?

1 个答案:

答案 0 :(得分:2)

(x:xs)不是元组。括号只是表达优先权。 x:xs是一个匹配列表构造函数的模式(它是中缀运算符:,通常发音为“#”;其中列表头绑定到变量x并且尾部绑定到变量xs。 由于Haskell的优先规则,你的第三行没有括号

myLength x:xs = 1 + myLength xs

将被解析为

(myLength x):xs = 1 + myLength xs

没有任何意义,所以你需要将列表模式括在括号中。

第三行的第二个版本在语法上是有效的,但并不意味着你认为它意味着什么(并且在这里没有正确的类型)。通常,[foo]是列表文字,在这种情况下表示包含foo的单个元素列表。您也可以将[foo]写为foo:[],他们为同一件事写了不同的符号。 您的第二个版本[x:xs]混合使用这两种符号,实际上代表一个嵌套列表,相当于(x:xs):[],即包含非空列表的单个元素列表。