在Benjamin Pierce关于类型和编程语言的书中,他将不同类型的类别分类如下:
*
正确类型(如Bool
和Bool -> Bool
)* -> *
类型操作符(即来自适当类型的函数)
适当的类型)* -> * -> *
从正确类型到类型运算符的函数类型
(即双参数运算符)(* -> *) -> *
从类型运算符到正确类型的函数类型如果我们考虑元组(1,2)
,如果我在Haskell GHCI中查询它的类型和种类,我得到:
Prelude> :t (1,2)
(1,2) :: (Num t1, Num t) => (t, t1)
Prelude> :k (,)
(,) :: * -> * -> *
我在上面的定义中没有看到* -> * -> *
如何属于第3类。据我所知,(,)
采用两种正确的类型来产生另一种正确的类型,而不是皮尔斯状态,它是从适当类型到类型操作符的函数。
我可能没有正确解释皮尔斯的分类。请有人使用我的2元组示例扩展类别3。
答案 0 :(得分:10)
种类与种类相似。
(,)
(值构造函数)的类型为a -> b -> (a, b)
。 (,) ()
的类型为b -> ((), b)
。 (,) () ()
的类型为((), ())
。
种类的工作方式完全相同。 (,)
(类型构造函数)的类型为* -> * -> *
。 (,) ()
的种类是* -> *
。这正是皮尔斯所说的。 (当然,(,) () ()
的种类是*
)。
修改强>
第四类是这样的类型:
newtype Fourth f = Fourth (f ())
Fourth
类型构造函数具有种类(* -> *) -> *
。它可以将任何类型(* -> *)
的{{1}}或Maybe
作为参数。因此,[]
或Fourth Maybe
等类型具有Fourth []
种类。