种类分类
Kind Classification of Types
在 Benjamin Pierce 关于类型和编程语言的书中,他将不同类型的类型分类如下:
*
正确类型的种类(如 Bool
和 Bool -> Bool
)
* -> *
类型运算符的种类(即来自适当类型的函数
正确的类型)
* -> * -> *
从专有类型到类型运算符的函数种类
(即双参数运算符)
(* -> *) -> *
从类型运算符到适当类型的函数种类
如果我们考虑元组 (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 Maybe
或 Fourth []
这样的类型有种类 *
.
在 Benjamin Pierce 关于类型和编程语言的书中,他将不同类型的类型分类如下:
*
正确类型的种类(如Bool
和Bool -> Bool
)* -> *
类型运算符的种类(即来自适当类型的函数 正确的类型)* -> * -> *
从专有类型到类型运算符的函数种类 (即双参数运算符)(* -> *) -> *
从类型运算符到适当类型的函数种类
如果我们考虑元组 (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 Maybe
或 Fourth []
这样的类型有种类 *
.