Created: 2023-01-11 09:39
A kind is a type of type. Values have types, types have kinds.
Saturated => has all the arguments provided
* is the most basic kind and almost everything has kind *
Anything at the value level is of kind *.
Int
Char
Bool
Maybe Int
Int -> Int
[[[Char]]]Maybe on the other hand is a type level function, so its kind is * -> *.
Because the function is * -> * we cannot give it any kind, only one of *.
Maybe :: * -> *So if we try Maybe IO we get a kind error, NOT a type error.
Some other examples:
(,,) => * -> * -> * -> *
(->) => * -> * -> *Given:
data WrappedInt f = Wrap (f Int)The kind the is:
WrappedInt :: (* -> *) -> *Type classes are parameterized by types of different kinds
class Eq (a :: *) where
a :: *
(==) :: a -> a -> Bool
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f bkind polymorphism
In the following example, the kind of f is not * -> *, since it could take any kind.
class Foo (f :: k -> *) where
foo :: forall (a :: k) (b :: k). f a -> f bWheres the case of functor, the kind is not generic because (a -> b) limits the kind of a and b to *.
Constraint kind
Enabled with ConstraintKinds, is the kind for constraints.
Eq :: * -> ConstraintShow a => a -> String
(=>) (Show a) (a -> String)
(=>) :: Constraint -> * -> *# kinds
# is enabled with the MagicHash extension.
id :: a -> aSince that works on any type, all types of kind * are actually pointers to something else that isn’t of kind * but instead it cannot be passed to *.
When we try to assign Bool as the type for the literal 3, we get an error. That is because number literals in Haskell are typed Num a.
ghci> 3 :: Bool
<interactive>:10:1: error:
• No instance for (Num Bool) arising from the literal ‘3’
• In the expression: 3 :: Bool
In an equation for ‘it’: it = 3 :: Bool
But if we try to assign Int#, which is the underlaying machine integer type of Int, the error is different.
ghci> 3 :: GHC.Prim.Int#
<interactive>:11:1: error:
• Couldn't match a lifted type with an unlifted type
When matching types
a0 :: *
GHC.Prim.Int# :: TYPE 'GHC.Types.IntRep
• In the expression: 3 :: GHC.Prim.Int#
In an equation for ‘it’: it = 3 :: GHC.Prim.Int#
# types have their own kind.
ghci> :k Num
Num :: * -> Constraint
ghci> :k Int
Int :: *
ghci> :k GHC.Prim.Int#
GHC.Prim.Int# :: TYPE 'GHC.Types.IntRep