haskell 的(->)是什么?

n8ghc7c1  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(222)

如果在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 (->),我这样做了,并获得了上面所示的信息。

z31licg0

z31licg01#

它只是函数类型构造函数。
类型(->) a b,通常写成中缀形式a -> b,是一种函数类型,它接受类型a作为参数,并返回类型b,你会在任何函数的类型签名中看到这一点。
GHC.Prim中的大多数其他东西一样,它是内置的,而且有点“神奇”,因为它没有值构造函数--但是你可以定义a -> b类型的值,这是一个函数,我想你已经知道了所有的方法。

qyswt5oh

qyswt5oh2#

我想指出(->)的类型,如果你问ghci,它会告诉你它的参数是(提升的)Type s

ghci> :k (->)
(->) :: Type -> Type -> Type

但是如果打印显式运行时表示,您将看到它接受TYPE的参数

ghci> :set -fprint-explicit-runtime-reps
ghci> import GHC.Exts
ghci> :k (->)
(->) :: forall {rep1 :: RuntimeRep} {rep2 :: RuntimeRep}.
        TYPE rep1 -> TYPE rep2 -> Type

通过RuntimeRep参数化

type RuntimeRep :: Type
data RuntimeRep
  = BoxedRep Levity -- ^ boxed; represented by a pointer
  | IntRep          -- ^ signed, word-sized value
  | Int8Rep         -- ^ signed,  8-bit value
  | ..
  | FloatRep        -- ^ a 32-bit floating point number
  | DoubleRep       -- ^ a 64-bit floating point number

-- | Whether a boxed type is lifted or unlifted.
type Levity :: Type
data Levity = Lifted | Unlifted

Type实际上是的同义词

type Type :: Type
type Type = TYPE LiftedRep

其中LiftedRep是装箱和提升的运行时表示的同义词(这是Haskell中的大多数类型,如IntBool)。

type LiftedRep :: RuntimeRep
type LiftedRep = BoxedRep Lifted

通过在运行时表示上的多态性,(->)可以接受Int# :: TYPE IntRepDouble# :: TYPE DoubleRep这样的未装箱参数,以及其他具有不寻常表示的奇怪类型:

ghci> :set -XMagicHash
ghci> :k Int# -> Double#
Int# -> Double# :: Type

此外,由于线性类型扩展,(->)实际上是FUN的类型同义词,

FUN :: Multiplicity -> TYPE rep1 -> TYPE rep2 -> Type

应用于“Many :: Multiplicity

type (->) :: forall {rep1} {rep2}. TYPE rep1 -> TYPE rep2 -> Type 
type (->) = FUN Many

相关问题