【问题标题】:What does (x:_) and [x:_] mean?(x:_) 和 [x:_] 是什么意思?
【发布时间】:2011-05-27 19:56:03
【问题描述】:
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:_) 的类型为 [a][x:_] 的类型为 [[a]]

标签: list haskell pattern-matching


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的评论。我想知道你可以为 haskell 新手推荐一本书或一个网站吗?
  • @tpark:这个网站包含很多关于学习 Haskell 的建议。这似乎是一个每隔一周就会出现的问题。这两个问题提供了一些有用的答案:"How to learn Haskell""Beginners guide to Haskell"。此搜索可能会为您提供更多有用的资源:@​​987654323@。我喜欢Learn You a Haskell
【解决方案2】:

这是一个名为pattern matching 的概念。 : 是一个中缀构造函数,就像+ 是一个中缀函数一样。在 Haskell 中,您可以使用构造函数进行模式匹配。

(1 : 2 : 3 : [])

[1, 2, 3]一样,方括号符号只是创建列表的语法糖。

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

【讨论】:

  • 感谢亚当斯。我也想知道合成糖是什么意思。所以英语不是我的母语。
猜你喜欢
  • 2020-03-18
  • 2021-08-02
  • 2015-03-24
  • 2020-10-02
  • 2018-05-03
  • 1970-01-01
  • 2015-12-30
  • 2018-01-31
  • 2018-11-24
相关资源
最近更新 更多