haskell 中的函数箭头是什么样的?

问题描述 投票:0回答:1

到现在为止,我一直认为

(->)
类型有
* -> * -> *
那种。但令我困惑的是,它也适用于未提升的类型(例如
Int#
)。

我用 ghci 检查了类型并得到了

* -> * -> *
正如预期的那样。 这就是我能弄清楚的,但我不明白箭头是如何多态的。

ghci> :k (->)
(->) :: * -> * -> *
ghci> :k Int#
Int# :: TYPE IntRep
ghci> :k (->) Int#
(->) Int# :: * -> *

haskell polykinds
1个回答
0
投票

事实上,这种类型对于任何

RuntimeRep
都是多态的,只是默认情况下是隐藏的。有一些标志可以显示详细信息。

λ :set -fprint-explicit-foralls
λ :set -fprint-explicit-kinds
λ :set -fprint-explicit-runtime-reps
λ :set -XNoStarIsType
λ :kind (->)
(->) :: forall {q :: GHC.Types.RuntimeRep}
               {r :: GHC.Types.RuntimeRep}.
        TYPE q -> TYPE r -> Type
© www.soinside.com 2019 - 2024. All rights reserved.