参考Haskell中的列表,“@”符号是什么意思?
我遇到了一段如下所示的Haskell代码:
ps@(p:pt)   @符号在这种情况下意味着什么? 我似乎无法在Google上find任何信息(很遗憾很难在Google上search符号),而且在Prelude文档中找不到该函数,所以我认为它必须是某种语法糖。 
 是的,这只是句法糖,用@朗读“as”。  ps@(p:pt)给你的名字 
-  列表: ps
-  名单的头: p
-  列表的尾巴: 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 Tuple , b只是Maybe Tuple的第一个Just ,而c和d分别是元组中第一个和第二个Just中包含的值 
添加到其他人所说的,他们被称为as-patterns (在ML中,语法使用关键字“as”),并在Haskell报告模式部分进行了描述。