种类分类

Kind Classification of Types

在 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 (,)
(,) :: * -> * -> *

我不明白 * -> * -> * 怎么会落入他上面的定义中的第 3 类。据我所知,(,) 使用两个适当的类型来生成另一个适当的类型,而不是像皮尔斯所说的那样,这是一个从适当类型到类型运算符的函数。

我可能没有正确解读 Pierce 的分类。请有人可以使用我的二元组示例扩展类别 3。

种类像类型一样被柯里化。

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

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


编辑

第四类是这样的类型:

newtype Fourth f = Fourth (f ())

Fourth 类型构造函数具有种类 (* -> *) -> *。它可以将类型为 (* -> *) 的任何类型作为参数,例如 Maybe[]。所以像 Fourth MaybeFourth [] 这样的类型有种类 *.