“@”符号在引用Haskell中的列表时意味着什么?

时间:2009-07-20 13:07:04

标签: haskell syntax

我遇到了一段看起来像这样的Haskell代码:

ps@(p:pt)

@符号在此上下文中的含义是什么?我似乎无法在Google上找到任何信息(遗憾的是在Google上搜索符号很难),而且我在Prelude文档中找不到该功能,所以我想它必须是某种语法糖。 / p>

4 个答案:

答案 0 :(得分:161)

是的,它只是语法糖,@大声朗读为“as”。 ps@(p:pt)为您提供了

的名称
  1. 列表:ps
  2. 列表的头部:p
  3. 列表的尾部:pt
  4. 如果没有@,您必须在(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 Tupleb只是元组中的第一个Justcd分别是元组中第一个和第二个Just中包含的值

答案 3 :(得分:8)

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