参考Haskell中的列表,“@”符号是什么意思?

我遇到了一段如下所示的Haskell代码:

ps@(p:pt) 

@符号在这种情况下意味着什么? 我似乎无法在Google上find任何信息(很遗憾很难在Google上search符号),而且在Prelude文档中找不到该函数,所以我认为它必须是某种语法糖。

是的,这只是句法糖,用@朗读“as”。 ps@(p:pt)给你的名字

  1. 列表: ps
  2. 名单的头: p
  3. 列表的尾巴: pt

没有@ ,你必须在(1)或(2):( 3)之间进行select。

这个语法实际上适用于任何构造函数。 如果你有data Tree a = Tree a [Tree a] ,那么t@(Tree _ kids)让你访问树及其子节点。

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

如果你想把一个参数“分解”成它的部分,而在你的函数中仍然需要整个参数作为一个整体,这是很有用的。 在这种情况下的一个例子是标准库中的tails函数:

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

我想补充@在各个层面上都有作用,这意味着你可以这样做:

 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只是Maybe Tuple的第一个Just ,而cd分别是元组中第一个和第二个Just中包含的值

添加到其他人所说的,他们被称为as-patterns (在ML中,语法使用关键字“as”),并在Haskell报告模式部分进行了描述。