种类分类

时间:2015-05-26 01:28:35

标签: haskell functional-programming

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

  1. *正确类型(如BoolBool -> Bool
  2. * -> *类型操作符(即来自适当类型的函数) 适当的类型)
  3. * -> * -> *从正确类型到类型运算符的函数类型 (即双参数运算符)
  4. (* -> *) -> *从类型运算符到正确类型的函数类型
  5. 如果我们考虑元组(1,2),如果我在Haskell GHCI中查询它的类型和种类,我得到:

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

    我在上面的定义中没有看到* -> * -> *如何属于第3类。据我所知,(,)采用两种正确的类型来产生另一种正确的类型,而不是皮尔斯状态,它是从适当类型到类型操作符的函数。

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

1 个答案:

答案 0 :(得分:10)

种类与种类相似。

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

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

修改

第四类是这样的类型:

newtype Fourth f = Fourth (f ())

Fourth类型构造函数具有种类(* -> *) -> *。它可以将任何类型(* -> *)的{​​{1}}或Maybe作为参数。因此,[]Fourth Maybe等类型具有Fourth []种类。