【问题标题】:What does the "@" symbol mean in reference to lists in Haskell?参考 Haskell 中的列表,“@”符号是什么意思?
【发布时间】:2009-07-20 13:07:04
【问题描述】:

我遇到了一段类似这样的 Haskell 代码:

ps@(p:pt)

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

【问题讨论】:

  • 不要尝试搜索该特定符号。一般搜索 Haskell 语法,然后在整个讨论中找到符号。例如,“Haskell 语法”的最高 Google 结果:cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html。该页面上第二次出现@ 说明了这一点。
  • 幸好我准确地提到了我是如何找到那个 URL 的,@Iter。今天任何人都可以重复这个过程,并在他们找到的任何页面上找到答案。

标签: haskell syntax


【解决方案1】:

是的,它只是语法糖,@ 朗读为“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”
【解决方案2】:

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

如果您想将参数“分解”成各个部分,同时在函数的某个位置仍需要将参数作为一个整体,这很有用。一个例子就是标准库中的tails 函数:

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

【讨论】:

    【解决方案3】:

    我想补充一点,@ 适用于所有级别,这意味着您可以这样做:

    let a@(b@(Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)
    

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

    所以基本上这是一种将模式绑定到值的方法。这也意味着它适用于 any 类型的模式,而不仅仅是列表,如上所示。了解这一点非常有用,因为这意味着您可以在更多情况下使用它。

    在这种情况下,a 是整个 Maybe Tuple,b 只是元组中的第一个 Just,c 和 d 是第一个和第二个 @987654330 中包含的值元组中的@分别

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2012-02-26
        • 2022-01-22
        • 2011-04-13
        相关资源
        最近更新 更多