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

mip*_*adi 118 syntax haskell

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

ps@(p:pt)
Run Code Online (Sandbox Code Playgroud)

@在这种情况下,符号意味着什么?我似乎无法在Google上找到任何信息(遗憾的是很难在Google上搜索符号),而且我在Prelude文档中找不到该功能,所以我想它必须是某种语法糖.

Nat*_*ers 169

是的,这只是语法糖,@大声朗读为"as".ps@(p:pt)给你的名字

  1. 列表: ps
  2. 列表的头部: p
  3. 列表的尾巴: pt

没有@,你必须在(1)或(2):( 3)之间做出选择.

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

  • 它被称为"as-pattern" (5认同)
  • 您知道这种语法的名称吗? (3认同)

sth*_*sth 40

@符号用于双方提供一个名称参数和比赛反对跟随某一模式的参数@.它不是特定于列表,也可以与其他数据结构一起使用.

如果您想要将参数"分解"到它的部分,同时仍然需要在函数中的某个地方整个参数,这将非常有用.这种情况的一个例子是tails标准库中的函数:

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs
Run Code Online (Sandbox Code Playgroud)


Ele*_*fee 20

我想补充说,它@适用于所有级别,这意味着你可以这样做:

let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)
Run Code Online (Sandbox Code Playgroud)

然后会产生这个: ((Just 1, Just 2), Just 1, 1, 2)

所以基本上它是一种将模式绑定到值的方法.这也意味着它适用于任何类型的模式,而不仅仅是列表,如上所示.这是一个非常有用的东西,因为它意味着你可以在更多的情况下使用它.

在这种情况下,a是整个Maybe Tuple,b只是第一Just元组,并cd被包含在第一和第二值Just分别在元组


new*_*cct 9

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