跳转到内容

Haskell/种类

来自 Wikibooks,开放世界中的开放书籍

面向 C++ 用户的种类

[编辑 | 编辑源代码]
  • * 是任何具体类型,包括函数。它们都具有 * 种类
 type MyType = Int
 type MyFuncType = Int -> Int
 myFunc :: Int -> Int
 typedef int MyType;
 typedef int (*MyFuncType)(int);
 int MyFunc(int a);
  • * -> * 是一个接受一个类型参数的模板。它就像一个从类型到类型的函数:你输入一个类型,结果是一个类型。MyData 的两种用法可能会造成混淆(尽管你可以随意为它们取不同的名称) - 第一个是类型构造函数,第二个是数据构造函数。它们分别等效于 C++ 中的类模板和构造函数。上下文可以解决歧义 - 在 Haskell 期望类型的地方(例如,在类型签名中),MyData 是一个类型构造函数,在期望值的地方,它是一个数据构造函数。


 data MyData t -- type constructor with kind * -> *
               = MyData t -- data constructor with type a -> MyData a
 *Main> :k MyData
 MyData :: * -> *
 *Main> :t MyData
 MyData :: a -> MyData a
 template <typename t> class MyData
 {
    t member;
 };
  • * -> * -> * 是一个接受两个类型参数的模板


 data MyData t1 t2 = MyData t1 t2
 template <typename t1, typename t2> class MyData
 {
    t1 member1;
    t2 member2;
    MyData(t1 m1, t2 m2) : member1(m1), member2(m2) { }
 };
  • (* -> *) -> * 是一个接受一个种类为 (* -> *) 的模板参数的模板


 data MyData tmpl = MyData (tmpl Int)
 template <template <typename t> class tmpl> class MyData
 {
    tmpl<int> member1;
    MyData(tmpl<int> m) : member1(m) { }
 };
华夏公益教科书