)和[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 ,并且您不关心列表_的其余部分。

链接地址: http://www.djcxy.com/p/80793.html

上一篇: ) and [x:

下一篇: Learning Haskell maps, folds, loops and recursion