Haskell 什么是'@';你是说哈斯克尔?

Haskell 什么是'@';你是说哈斯克尔?,haskell,at-sign,Haskell,At Sign,我试过谷歌搜索,但没有成功。通过阅读一些文章,我进一步加深了对Haskell的了解,我发现有一篇文章使用了我从未见过的语法。 例如: reconstruct node@(Node a b c l r) parent@(Node b d le ri) 我以前从未见过这些。我试着在网上搜索答案,但没有找到答案。这仅仅是一种嵌入标记以帮助使事情更清楚的方法,还是它们对代码有实际影响?它用于模式匹配。现在节点变量将引用参数节点a b c l r的整个节点数据类型。因此,您可以使用Node将其向上传递,

我试过谷歌搜索,但没有成功。通过阅读一些文章,我进一步加深了对Haskell的了解,我发现有一篇文章使用了我从未见过的语法。 例如:

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

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

它用于模式匹配。现在
节点
变量将引用参数
节点a b c l r
的整个
节点
数据类型。因此,您可以使用
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

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

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

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

{-#  LANGUAGE TypeApplications  #-}
例子:
$ghci
GHCi,8.2.2版:http://www.haskell.org/ghc/  :? 求救
λ> 
λ> 设x=(读@Integer“33”)
:4:10:错误:
表达式上下文中的模式语法:read@Integer
您的意思是启用类型应用程序吗?
λ> 
λ> :set-xtype应用程序
λ>
λ> 设x=(读@Integer“33”)
λ>
λ> :t x
x::整数
λ> 
λ> x
33
λ> 

在中搜索“as patterns”以获取介绍。虽然传统搜索引擎在搜索特殊字符时不会返回有用的结果,但Haskell自己的搜索引擎可用于此类问题。@Comics答案比答案更有用!这回答了你的问题吗?更简单的是
someFunctionleaf@Leaf{}=leaf
@AndrásKovács,但它不需要对
leaf{}
进行一些解释吗?哦,终于发现它需要
{-#LANGUAGE TypeApplications}
,仍然在学习它是什么。@jpmarinier,不,它不是任何类型的类型转换。它确实允许您应用类型参数,但这些参数的含义取决于所涉及的特定函数或方法。@jpmarinier,它太松散了,我甚至猜不出它的含义
foo@Int
可以很容易地成为一个函数,它使用两个字符并生成一个
IO
操作返回
()
$ 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
 λ>