如果在GHCi中键入:i (->)
并按Enter键,则返回以下内容:
data (->) t1 t2 -- Defined in ‘GHC.Prim’
infixr 0 `(->)`
instance Monad ((->) r) – Defined in ‘GHC.Base’
instance Functor ((->) r) – Defined in ‘GHC.Base’
instance Applicative ((->) a) – Defined in ‘GHC.Base’
instance Monoid b => Monoid (a -> b) – Defined in ‘GHC.Base’
根据data
关键字判断,它是某种类型的构造函数,但它究竟构造什么?如果存在,这种类型的值构造函数又是什么?
当我了解到函数是Functor
类型类的一部分,并且在:i Functor
命令返回的类型类描述中被列为((->) r)
时,问题就出现了。我试图获得关于((->) r)
的信息,但是没有用。然后,在Functor
类型类的描述中,我发现了(Either a)
(它的描述可以用:i Either
获得,即没有参数),并意识到我应该尝试:i (->)
,我这样做了,并获得了上面所示的信息。
2条答案
按热度按时间z31licg01#
它只是函数类型构造函数。
类型
(->) a b
,通常写成中缀形式a -> b
,是一种函数类型,它接受类型a
作为参数,并返回类型b
,你会在任何函数的类型签名中看到这一点。像
GHC.Prim
中的大多数其他东西一样,它是内置的,而且有点“神奇”,因为它没有值构造函数--但是你可以定义a -> b
类型的值,这是一个函数,我想你已经知道了所有的方法。qyswt5oh2#
我想指出
(->)
的类型,如果你问ghci,它会告诉你它的参数是(提升的)Type
s但是如果打印显式运行时表示,您将看到它接受
TYPE
的参数通过
RuntimeRep
参数化Type
实际上是的同义词其中
LiftedRep
是装箱和提升的运行时表示的同义词(这是Haskell中的大多数类型,如Int
或Bool
)。通过在运行时表示上的多态性,
(->)
可以接受Int# :: TYPE IntRep
和Double# :: TYPE DoubleRep
这样的未装箱参数,以及其他具有不寻常表示的奇怪类型:此外,由于线性类型扩展,
(->)
实际上是FUN
的类型同义词,应用于“
Many :: Multiplicity
”