Haskell 中的 (->) 是什么?

Ska*_*kab 2 constructor haskell function functor

如果您输入:i (->)GHCi 并点击Enter它,则会返回以下内容:

\n
data (->) t1 t2     -- Defined in \xe2\x80\x98GHC.Prim\xe2\x80\x99\ninfixr 0 `(->)`\ninstance Monad ((->) r)\xc2\xa0\xe2\x80\x93 Defined in \xe2\x80\x98GHC.Base\xe2\x80\x99\ninstance Functor ((->) r)\xc2\xa0\xe2\x80\x93 Defined in \xe2\x80\x98GHC.Base\xe2\x80\x99\ninstance Applicative ((->) a)\xc2\xa0\xe2\x80\x93 Defined in \xe2\x80\x98GHC.Base\xe2\x80\x99\ninstance Monoid b => Monoid (a -> b)\xc2\xa0\xe2\x80\x93 Defined in \xe2\x80\x98GHC.Base\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

从关键字来看data,它是某种类型构造函数,但它到底构造什么以及该类型的值构造函数是什么(如果存在)?

\n

当我了解到函数是类型类的一部分并且在命令返回的类型类描述中Functor列出时,问题就出现了。我试图获取有关的信息,但无济于事。然后,在类型类的描述中,我发现(可以使用 获得其描述,即不带参数)并意识到我应该尝试一下,我这样做了并得到了上面显示的信息。((->) r):i Functor((->) r)Functor(Either a):i Either:i (->)

\n

Rob*_*ond 7

它只是函数类型构造函数。

类型(->) a b(通常以中缀形式写为)是将类型作为参数并返回类型a -> b的函数的类型。您将在任何函数的类型签名中看到这一点。ab

与 中的大多数其他内容一样GHC.Prim,它是内置的并且有点“神奇”,因为它没有值构造函数 - 但您可以以我期望的a -> b所有方式定义 type 的值,即一个函数已经知道了。

  • 我认为函数值总是使用 lambda 表达式“\ 模式 -> 表达式”或语法糖来构建。只是没有_解构_函数的模式——在 Haskell 中你真正能用函数做的就是将它应用于参数。 (2认同)