(x:_)和[x:_]是什么意思?

tpa*_*ark 5 haskell list pattern-matching

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
Run Code Online (Sandbox Code Playgroud)

我要求一个相当容易的问题,我不明白.在上面的代码中,我看到它需要一个输入列表.但在第三行,它说(x:_)哪些让我感到困惑.任何人都可以向我解释为什么他们写(x:_)而不是[x:_]

而且,我不明白是什么(x:_)意思.

谢谢.

sep*_*p2k 15

:是list的构造函数,它将新列表的头部作为其左参数,将tail作为其右参数.如果您将其用作此处的模式,则意味着您匹配的列表的头部将被赋予左侧模式,尾部将被赋予右侧.

所以在这种情况下,列表的头部存储在变量中x并且不使用尾部(_意味着您不关心该值).

是的,您还可以使用[]模式匹配列表,但只能使用固定大小的列表.例如,模式[x]匹配具有恰好一个元素的列表,然后将其存储在变量中x.同样[x,y]会将列表与两个元素匹配.

[x:y]因此,您建议的模式将匹配具有一个元素的列表,该元素与模式匹配x:y.换句话说,它将匹配包含一个列表的列表列表.


ada*_*mse 5

这是一种称为模式匹配的概念.:是一个中缀构造函数,就像+一个中缀函数.在Haskell中,您可以与构造函数进行模式匹配.

(1 : 2 : 3 : [])
Run Code Online (Sandbox Code Playgroud)

[1, 2, 3]与方括号相同,方括号表示法只是用于创建列表的语法糖.

您的模式(x : _)意味着您要将列表的第一个元素绑定到x,而您不关心列表的其余部分_.