引用Haskell中的列表时,“ @”符号是什么意思?


127

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

ps@(p:pt)

@在这种情况下,该符号是什么意思?我似乎无法在Google上找到任何信息(不幸的是,很难在Google上搜索符号),并且在Prelude文档中也找不到该功能,因此我想它一定是某种语法糖。


14
不要尝试搜索该特定符号。通常搜索Haskell语法,然后在整个讨论中找到该符号。例如,对于“ Haskell语法”,Google排名最高的结果是:cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html@该页面上第二次出现对此进行了解释。
罗布·肯尼迪

1
好消息是我确切地提到了如何找到该URL @Iter。任何人都可以今天重复该过程,并在找到的任何页面上找到答案。
Rob Kennedy

Answers:


179

是的,它只是语法糖,@大声读为“ as”。ps@(p:pt)给你起名字

  1. 名单: ps
  2. 名单的负责人: p
  3. 列表的尾巴: pt

没有@,您必须在(1)或(2):( 3)之间选择。

这种语法实际上适用于任何构造函数。如果您拥有data Tree a = Tree a [Tree a],则t@(Tree _ kids)可以访问树及其子级。


3
您知道这种语法的名称吗?
丹扎

7
它被称为“模式”
adamo,

41

@符号既用于给参数命名,又用于将该参数与后面的模式匹配@。它不特定于列表,也可以与其他数据结构一起使用。

如果您想将参数“分解”为各个部分,同时仍需要整个函数中的参数,这将很有用。一种情况就是tails标准库中的函数:

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

21

我想补充一点,它@可以在所有级别使用,这意味着您可以执行以下操作:

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只是第一Just元组,并cd被包含在第一和第二值Just中的元组分别


9

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.