参考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报告模式部分进行了描述。