使用 ghci 调查 (->) 并试图找到它的根源

Investigating (->) with ghci and trying to get to its roots

我正在尝试使用 ghci 来调查类型 (->)

我很想知道为什么我可以问 :t (+),但不能问 :t (->):

Prelude> :t (->)
<interactive>:1:2: error: parse error on input ‘->’

幸运的是,两个运营商都允许使用:i进行调查,所以我推测这都是因为(+)是class Num的方法,而(->)是数据。

深入研究 (->)

Prelude> :i (->)
data (->) (a :: TYPE q) (b :: TYPE r)   -- Defined in ‘GHC.Prim’
infixr 0 ->
instance Applicative ((->) a) -- Defined in ‘GHC.Base’
instance Functor ((->) r) -- Defined in ‘GHC.Base’
instance Monad ((->) r) -- Defined in ‘GHC.Base’
instance Monoid b => Monoid (a -> b) -- Defined in ‘GHC.Base’
instance Semigroup b => Semigroup (a -> b) -- Defined in ‘GHC.Base’

但是Hackage page for GHC.Prim中没有data (->)的踪迹。可能我检查的语言版本不对,但是AFAIS 0.5.3是最新的,我的ghci版本是最新的。

在哪里可以找到data (->)的声明?

最终,我想阅读有关 TYPE 的内容,但我在 Google 上检索到的所有页面都在谈论 type

在哪里可以找到有关 TYPE 的信息?

既然评论里都给出了答案,我总结一下:

  • (->) 是类型构造函数。您可以使用 :k (->) @Willem van Onsem

  • 进行调查
  • GHC.Prim 没有任何源代码。它完全由编译器生成,您无需费心查看它。当 GHCi 告诉您那里定义了一些东西时,请阅读说它来了 "from the sky" @dfeuer