我遇到了一段看起来像这样的Haskell代码:
ps@(p:pt)
@
符号在此上下文中的含义是什么?我似乎无法在Google上找到任何信息(遗憾的是在Google上搜索符号很难),而且我在Prelude文档中找不到该功能,所以我想它必须是某种语法糖。 / p>
答案 0 :(得分:161)
是的,它只是语法糖,@
大声朗读为“as”。 ps@(p:pt)
为您提供了
ps
p
pt
如果没有@
,您必须在(1)或(2):( 3)之间进行选择。
这种语法实际上适用于任何构造函数;如果您有data Tree a = Tree a [Tree a]
,则t@(Tree _ kids)
可让您访问树及其子项。
答案 1 :(得分:39)
@
符号用于为参数指定名称,并将该参数与@
后面的模式匹配。它不是特定于列表的,也可以与其他数据结构一起使用。
如果你想将一个参数“分解”成它的部分,同时仍然需要在你的函数中作为一个整体的参数,这是很有用的。这种情况的一个例子是标准库中的tails
函数:
tails :: [a] -> [[a]]
tails [] = [[]]
tails xxs@(_:xs) = xxs : tails xs
答案 2 :(得分:19)
我想补充说@
适用于所有级别,这意味着你可以这样做:
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
只是元组中的第一个Just
,c
和d
分别是元组中第一个和第二个Just
中包含的值
答案 3 :(得分:8)
要添加其他人所说的内容,它们被称为 as-patterns (在ML中,语法使用关键字“as”),并在Haskell报告的部分中进行了描述。 patterns