研究ghci(->)并尝试扎根

Mar*_*lli 6 haskell ghci

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

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

Prelude> :t (->)
<interactive>:1:2: error: parse error on input ‘->’
Run Code Online (Sandbox Code Playgroud)

幸运的是,两个运算符都允许使用进行调查:i,所以我想都是因为它(+)是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’
Run Code Online (Sandbox Code Playgroud)

但是data (->)GHC.Prim的Hackage页面中没有任何痕迹。可能我检查的语言版本错误,但是AFAIS 0.5.3是最新的,而我的ghci版本是最新的。

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

最终,我想读一读TYPE,但是我在Google上检索到的所有页面都在谈论type

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

Mar*_*lli 1

鉴于评论里已经给出了答案,我总结一下:

  • (->)是一个类型构造函数。您可以通过@Willem van Onsem进行调查:k (->)

  • GHC.Prim任何地方都没有源代码。它完全由编译器生成,您无需费心查看它。当 GHCi 告诉您某些内容在那里定义时,请将其理解为“来自天空” @dfeuer