list - 什么是(x :_) and [x:_] mean?

标签 list haskell 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

我要问一个我不明白的相当简单的问题。
在上面的代码中,我看到它需要一个输入列表。
但在第三行,它说 (x:_)这让我很困惑。
谁能向我解释他们为什么写 (x:_)而不是 [x:_] ?

另外,我不明白 (x:_)方法。

谢谢你。

最佳答案

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

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

是的,您也可以使用 []对列表进行模式匹配,但仅限于固定大小的列表。例如模式 [x]匹配只有一个元素的列表,然后将其存储在变量 x 中.同样[x,y]将匹配具有两个元素的列表。

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

关于list - 什么是(x :_) and [x:_] mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4482697/

相关文章:

algorithm - 如何将一棵树与大量模式进行匹配?

pattern-matching - 模式匹配中 byte_size 的语法是什么?

c++ - 检测多字节字符编码

list - Common Lisp 从列表中返回关联作为新列表

python - 是否有任何 python 模块可以计算(列表,列表)元组的频率?

haskell - 为 GHC 和 Makefile 样式构建生成正确的链接依赖项

haskell - 编写一个构造集合的递归函数

python - 为什么二级字典的值在 Python 2.7 中都指向同一个对象?

java - 使用比较器对字符串列表进行排序

list - 制作一个列表列表来计算 Haskell 中的帕斯卡三角形