了解 ($) 运算符的类型

F. *_*Zer 9 haskell types

模块GHC/Base.hs包含以下运算符定义:

($) :: forall r a (b :: TYPE r). (a -> b) -> a -> b
f $ x =  f x
Run Code Online (Sandbox Code Playgroud)
  • 通用量化变量是什么r意思?
  • 签名还不够(a -> b) -> a -> b笼统吗?
  • 什么是TYPE

che*_*ner 8

TYPE提供对表示多态性的支持。

您习惯使用的类型有 kind Type(以前称为*)。但还有其他类型[*]。Type只是 的别名TYPE LiftedRep。我们可以更正式地将“通常”类型写($)

($) :: forall (a :: Type) (b :: Type) . (a -> b) -> a -> b
-- ($) :: forall (a :: TYPE LiftedRep) (b :: TYPE LiftedRep) . (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)

just的引入r意味着我们不限b于“普通”类型。b不一定要有善良TYPE LiftedRepTYPE r它可以对任何r有效的参数有 kind TYPE


[*] 英语意义上的“kind”,而不是 Haskell 类型系统中称为“kind”的正式概念。

  • @F.Zer 类型 `Int#` 是一个未装箱的原始 int,具有类型 `TYPE 'GHC.Types.IntRep`。 (4认同)