类型的种类分类

M.K*_*.K. 1 haskell functional-programming

在Benjamin Pierce关于类型和编程语言的书中,他将不同类型的类别分类如下:

  1. *那种合适的类型(比如BoolBool -> Bool)
  2. * -> * 类型操作符的类型(即从适当类型到适当类型的函数)
  3. * -> * -> * 从适当类型到类型运算符的函数类型(即双参数运算符)
  4. (* -> *) -> * 类型操作符到适当类型的函数类型

如果我们考虑元组(1,2),如果我在Haskell GHCI中查询它的类型和种类,我得到:

Prelude> :t (1,2)
(1,2) :: (Num t1, Num t) => (t, t1)

Prelude> :k (,)
(,) :: * -> * -> *
Run Code Online (Sandbox Code Playgroud)

我不明白* -> * -> *他的定义如何落入第3类.据我所知,(,)采用两种合适的类型来产生另一种合适的类型,而不是皮尔斯状态,它是从适当类型到类型操作符的函数.

我可能没有正确解释皮尔斯的分类.有人可以使用我的2元组示例扩展类别3.

Car*_*arl 10

种类与种类一样是咖喱.

(,)(值构造函数)的类型是a -> b -> (a, b).类型(,) ()b -> ((), b).类型(,) () ()((), ()).

种类的工作方式完全相同.那种(,)(类型构造)是* -> * -> *.那种(,) ()* -> *.这正是皮尔斯所说的.(当然,那种(,) () ()*).


编辑

第四类是一个如下所示的类型:

newtype Fourth f = Fourth (f ())
Run Code Online (Sandbox Code Playgroud)

Fourth类型的构造函数有样(* -> *) -> *.它可以作为任何类型的参数作为参数(* -> *),如Maybe[].所以类型喜欢Fourth MaybeFourth []有类型*.