【问题标题】:What does '@' mean in Haskell?Haskell 中的“@”是什么意思?
【发布时间】:2015-07-31 07:37:58
【问题描述】:

我试过用谷歌搜索,但没能找到。我通过阅读一些文章来加深我的 Haskell 知识,我遇到了一篇使用我以前从未见过的语法的文章。 一个例子是:

reconstruct node@(Node a b c l r) parent@(Node b d le ri)

我以前从未见过这些@。我尝试在网上搜索答案,但没有找到答案。这只是一种嵌入标签以帮助使事情更清晰的方法,还是它们对代码有实际影响?

【问题讨论】:

标签: haskell at-sign


【解决方案1】:

除了@Sibi 的答案中描述的参数模式匹配用法之外,在 Haskell 中,“at”字符('@',也称为arobase 字符)可以在某些上下文中用于强制键入决定。 @Josh.F 在 cmets 中提到了这一点。

不是默认语言功能的一部分,被称为Type Application Haskell 语言扩展。总之,该扩展允许您为诸如read 之类的多态函数提供显式类型参数。在经典的 .hs 源文件中,必须包含相关的 pragma:

{-#  LANGUAGE TypeApplications  #-}

示例:

$ ghci
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
 λ> 
 λ> let x = (read @Integer "33")

 <interactive>:4:10: error:
    Pattern syntax in expression context: read@Integer
    Did you mean to enable TypeApplications?
 λ> 
 λ> :set -XTypeApplications
 λ>
 λ> let x = (read @Integer "33")
 λ>
 λ> :t x
 x :: Integer
 λ> 
 λ> x
 33
 λ> 

【讨论】:

    【解决方案2】:

    它用于模式匹配。现在node 变量将引用参数Node a b c l r 的整个Node 数据类型。因此,您可以使用node 来代替将其传递给函数,而不是将其作为Node a b c l r 传递给函数。

    一个更简单的例子来演示它:

    data SomeType = Leaf Int Int Int | Nil deriving Show
    
    someFunction :: SomeType -> SomeType
    someFunction leaf@(Leaf _ _ _) = leaf
    someFunction Nil = Leaf 0 0 0
    

    someFunction也可以写成:

    someFunction :: SomeType -> SomeType
    someFunction (Leaf x y z) = Leaf x y z
    someFunction Nil = Leaf 0 0 0
    

    看看第一个版本有多简单?

    【讨论】:

    • 更简单的是someFunction leaf@Leaf{} = leaf
    • @AndrásKovács,但不需要对Leaf{}做一些解释吗?
    • 哇,终于知道它需要{-# LANGUAGE TypeApplications #-},但仍在学习它是什么。
    • @jpmarinier,不,它不是任何类型的类型转换。它确实可以让你应用类型参数,但它们的含义取决于所涉及的特定函数或方法。
    • @jpmarinier,它太松散了,我什至无法猜测它是什么意思。 foo @Int 很容易成为一个函数,它需要两个字符并产生一个 IO 动作返回 ()
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2016-09-14
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多