Fajták

Problémafelvetés

Legyen

data Maybe a = Nothing | Just a

Ekkor a következő kifejezések típusok:

-- Maybe Int
-- Maybe (Maybe Bool)
-- Maybe [a]
-- Maybe

Az utolsó típus csak egy újabb típus hozzátételével lesz “valódi”. Ezt akarjuk kifejezni a típusok típusozásával.

Típusok típusa: a fajta

A típusok típusát fajtának nevezzük.

Példák:

-- Maybe Int            :: *
-- Maybe (Maybe Bool)   :: *
-- Maybe [a]            :: *
-- Maybe                :: * -> *

Példák

További példák:

-- Char            :: *
-- Bool            :: *
-- Int             :: *
-- [Int]           :: *
-- []              :: * -> *
-- (a, b)          :: *
-- (,)             :: * -> * -> *
-- (,) Int         :: * -> *
-- (,) Int Bool    :: *
-- (,,)            :: * -> * -> * -> *

Fajtavizsgálat

A típusellenőrzés során a fajtát is ellenőrzi a fordító.

A következő típusok például hibásak:

[Maybe]
Maybe Maybe
Maybe []

A hibaüzenet általában ehhez hasonló:

`Maybe' is not applied to enough type arguments
Expected kind `*', but `Maybe' has kind `* -> *'

További megszorítások

Alkalmazási terület

A típusosztályok paramétere lehet *-tól eltérő fajtájú is.

Példa a Prelude-ből:

-- class  Functor f  where
--    fmap :: (a -> b) -> f a -> f b

A f típusváltozó fajtája * -> *.

A Functor jelentősége

Tekintsük a lehetséges map-szerű függvények típusait:

map          :: (a -> b) -> [a]     -> [b]
mapMaybe     :: (a -> b) -> Maybe a -> Maybe b
mapIO        :: (a -> b) -> IO a    -> IO b
mapSnd       :: (a -> b) -> (c, a)  -> (c, b)

Ezek a függvényeket jelölhetjük a közös fmap névvel ha példányosítunk:

instance Functor []
instance Functor Maybe
instance Functor IO
instance Functor ((,) c)

Az utolsó kivételével ezek a példányok definiálva is vannak a Prelude-ben.