类型可以看做是值的“标签”,用来区分不同种类的值。
而kind
可以看做是类型的“标签”,用来区分不同的类型。
例如:
ghci> :k Int
Int :: *
kind为“*
”,表示Int是一个具体类型。
具体类型是那些不接受类型参数的类型。
值的类型,只能是一个具体类型。
ghci> :k Maybe
Maybe :: * -> *
“* -> *
”这种kind
,说明Maybe
类型构造器,接受一个具体类型作为参数,返回一个具体类型。
ghci> :k Maybe Int
Maybe Int :: *
ghci> :k Either
Either :: * -> * -> *
这说明Either
接受两个具体类型作为参数,返回一个具体类型。
ghci> :k Either String
Either String :: * -> *
ghci> :k Either String Int
Either :: *
我们看Functor的定义,
class Functor f where
fmap :: (a -> b) -> f a -> f b
这说明,
> :k f
f :: * -> *