“@”符号在提及哈斯克尔的名单时是什么意思?

我看到一段 Haskell 代码,看起来像这样:

ps@(p:pt)

在这种情况下,@符号意味着什么?我似乎找不到任何关于谷歌的信息(不幸的是,在谷歌上很难搜索到符号) ,我也找不到序曲文档中的函数,所以我想它一定是某种语法糖。

45992 次浏览

是的,它只是一种语法糖,@读作“ as”

  1. 名单: ps
  2. 名单首字母: p
  3. 名单的尾部: pt

如果没有 @,你必须在(1)或(2) : (3)之间做出选择。

这种语法实际上适用于任何构造函数; 如果您有 data Tree a = Tree a [Tree a],那么 t@(Tree _ kids)允许您访问树及其子代。

@符号用于为参数提供名称,并将该参数与遵循 @的模式进行匹配。它不特定于列表,也可以与其他数据结构一起使用。

如果您希望将参数“分解”为它的各个部分,同时仍然需要在函数中的某个地方将参数作为一个整体,那么这种方法非常有用。这种情况的一个例子是标准库中的 tails函数:

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs

为了补充其他人已经说过的内容,他们被称为 模式(在 ML 中语法使用关键字“ as”) ,并在关于 模式的 Haskell 报告部分进行了描述。

我想补充的是,@可以在所有级别上工作,这意味着你可以这样做:

let a@(b@(Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)

然后产生这个: ((Just 1, Just 2), Just 1, 1, 2)

所以基本上这是一种将模式绑定到值的方法。这也意味着它适用于 任何类型的模式,而不仅仅是列表,如上所示。这是一个非常有用的知识,因为它意味着您可以在更多的情况下使用它。

在这种情况下,a是整个 Maybe Tupleb只是元组中的第一个 Just,而 cd分别是元组中第一个和第二个 Just中包含的值