我遇到了一段看起来像这样的Haskell代码:
ps@(p:pt)
Run Code Online (Sandbox Code Playgroud)
@在这种情况下,符号意味着什么?我似乎无法在Google上找到任何信息(遗憾的是很难在Google上搜索符号),而且我在Prelude文档中找不到该功能,所以我想它必须是某种语法糖.
Nat*_*ers 169
是的,这只是语法糖,@大声朗读为"as".ps@(p:pt)给你的名字
ps ppt 没有@,你必须在(1)或(2):( 3)之间做出选择.
这种语法实际上适用于任何构造函数; 如果你有data Tree a = Tree a [Tree a],那么t@(Tree _ kids)你可以访问树及其子.
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元组,并c和d被包含在第一和第二值Just分别在元组