)和[x:
head' :: [a] -> a
head' [] = error "No head for empty lists!"
head' (x:_) = x
head' :: [a] -> a
head' xs = case xs of [] -> error "No head for empty lists!"
(x:_) -> x
我在问一个我不明白的相当简单的问题。 在上面的代码中,我发现它需要一个输入列表。 但是在第三行,它说(x:_)
让我感到困惑。 任何人都可以向我解释为什么他们写了(x:_)
而不是[x:_]
?
另外,我不明白(x:_)
是什么意思。
谢谢。
:
是列表的构造函数,它将新列表的头部作为其左侧参数,将尾部作为其正确参数。 如果你将它用作这里的模式,这意味着你匹配的列表的头部被赋予左边的模式,尾部赋予给右边。
因此,在这种情况下,列表的头部存储在变量x
,尾部不使用( _
表示您不关心该值)。
是的,您也可以使用[]
模式匹配列表,但只有固定大小的列表。 例如,模式[x]
与一个元素相匹配,然后存储在变量x
。 同样, [x,y]
将与两个元素的列表相匹配。
因此,您提出的模式[x:y]
会匹配一个列表和一个匹配模式x:y
元素。 换句话说,它将匹配包含恰好一个列表的列表列表。
这是一个称为模式匹配的概念。 :
是一个中缀构造函数,就像+
是一个中缀函数。 在Haskell中,模式与构造函数匹配。
(1 : 2 : 3 : [])
与[1, 2, 3]
,方括号表示法只是用于创建列表的语法糖。
您的模式(x : _)
意味着您想要将列表的第一个元素绑定到x
,并且您不关心列表_
的其余部分。
上一篇: ) and [x: