Haskell/种类
外观
< Haskell
- * 是任何具体类型,包括函数。它们都具有 * 种类
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) { }
};