到现在为止,我一直认为
(->)
类型有* -> * -> *
那种。但令我困惑的是,它也适用于未提升的类型(例如Int#
)。
我用 ghci 检查了类型并得到了
* -> * -> *
正如预期的那样。
这就是我能弄清楚的,但我不明白箭头是如何多态的。
ghci> :k (->)
(->) :: * -> * -> *
ghci> :k Int#
Int# :: TYPE IntRep
ghci> :k (->) Int#
(->) Int# :: * -> *
事实上,这种类型对于任何
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