)和[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:
