首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“@”在Haskell是什么意思?

“@”在Haskell是什么意思?
EN

Stack Overflow用户
提问于 2015-05-19 12:55:11
回答 2查看 9K关注 0票数 11

我试过谷歌搜索但结果很短。我正在通过阅读一些文章来深化我的Haskell知识,我偶然发现了一篇使用我从未见过的语法的文章。一个例子是:

代码语言:javascript
运行
复制
reconstruct node@(Node a b c l r) parent@(Node b d le ri)

我以前从未见过这些@s。我试着在网上搜索答案,但结果很短。这仅仅是一种嵌入标记以使事情更清晰的方式,还是它们对代码有实际影响?

EN

Stack Overflow用户

发布于 2019-11-09 16:32:28

使用@t作为类型指示符

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

这是而不是默认语言特性的一部分,被称为类型应用 Haskell语言扩展。总之,扩展允许您向多态函数(如read )提供显式类型参数。在经典的.hs源文件中,必须包括相关的实用程序:

代码语言:javascript
运行
复制
{-#  LANGUAGE TypeApplications  #-}

示例:

代码语言:javascript
运行
复制
$ 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")
 λ>
 λ> :type  x
 x :: Integer
 λ> 
 λ> x
 33
 λ> 

进一步详情

对于read多态函数,@引入的类型指示符与read返回的结果类型有关。但这是,而不是一般的

一般来说,您必须考虑显示在当前函数的类型签名中的类型变量。例如,让我们看看fmap库函数。

代码语言:javascript
运行
复制
fmap :: Functor ft => (a -> b) -> ft a -> ft b

在这里,我们有3种类型的变量,按外观顺序排列: ft,a,b。如果我们像这样专门化fmap

代码语言:javascript
运行
复制
myFmap = fmap  @type1  @type2  @type3

然后type1将与ft相关,type2将与a相关,type3将与b相关。此外,还有一个特殊的虚拟类型指示器@_,意思是:“这里,任何类型去”。

例如,我们可以强制fmap的输出类型为Integer,函子为普通列表[],而不指定输入类型a

代码语言:javascript
运行
复制
 λ> 
 λ> myFmap = fmap  @[]  @_  @Integer
 λ> 
 λ> :type myFmap
 myFmap :: (_ -> Integer) -> [_] -> [Integer]
 λ> 

至于read函数,它的类型是:

代码语言:javascript
运行
复制
read :: Read a => String -> a

因此,只有一个类型指示器的空间,它与read返回的结果类型有关,如上面所示。

票数 12
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30326249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档