好的,我正在看这个功能:
myLength :: [a] -> Int
myLength [] = 0
myLength (x:xs) = 1 + myLength xs
但我最困惑的是最后一行。这部分特别是:(x:xs)
实现这个时,我使用了方括号,因为我认为它是一个列表,我将它的第一个元素与其余元素分开。它是如何成为元组的?
第二行和第三行之间似乎有点不匹配。为什么这可能是一个空数组,但下一行是一个元组?这就是我最初的想法,并认为它最有意义,但它会引发错误。
myLength :: [a] -> Int
myLength [] = 0
myLength [x:xs] = 1 + myLength xs
我怎么知道何时使用括号以及何时使用方括号?
答案 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):[]
,即包含非空列表的单个元素列表。