我试过谷歌搜索但结果很短。我正在通过阅读一些文章来深化我的Haskell知识,我偶然发现了一篇使用我从未见过的语法的文章。一个例子是:
reconstruct node@(Node a b c l r) parent@(Node b d le ri)我以前从未见过这些@s。我试着在网上搜索答案,但结果很短。这仅仅是一种嵌入标记以使事情更清晰的方式,还是它们对代码有实际影响?
发布于 2019-11-09 16:32:28
使用@t作为类型指示符
除了@Sibi的答案中描述的参数模式匹配用法外,在Haskell中,"at“字符('@',也称为阿糖酶字符)可以在某些上下文中用于强制强制输入决策。@Josh.F的评论中提到了这一点。
这是而不是默认语言特性的一部分,被称为类型应用 Haskell语言扩展。总之,扩展允许您向多态函数(如read )提供显式类型参数。在经典的.hs源文件中,必须包括相关的实用程序:
{-# 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")
λ>
λ> :type x
x :: Integer
λ>
λ> x
33
λ> 进一步详情
对于read多态函数,@引入的类型指示符与read返回的结果类型有关。但这是,而不是一般的。
一般来说,您必须考虑显示在当前函数的类型签名中的类型变量。例如,让我们看看fmap库函数。
fmap :: Functor ft => (a -> b) -> ft a -> ft b在这里,我们有3种类型的变量,按外观顺序排列: ft,a,b。如果我们像这样专门化fmap:
myFmap = fmap @type1 @type2 @type3然后type1将与ft相关,type2将与a相关,type3将与b相关。此外,还有一个特殊的虚拟类型指示器@_,意思是:“这里,任何类型去”。
例如,我们可以强制fmap的输出类型为Integer,函子为普通列表[],而不指定输入类型a:
λ>
λ> myFmap = fmap @[] @_ @Integer
λ>
λ> :type myFmap
myFmap :: (_ -> Integer) -> [_] -> [Integer]
λ> 至于read函数,它的类型是:
read :: Read a => String -> a因此,只有一个类型指示器的空间,它与read返回的结果类型有关,如上面所示。
https://stackoverflow.com/questions/30326249
复制相似问题