使用 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
我正在尝试使用 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