Typy wyższego rzędu

Skąd wiadomo, że funkcja maybeToList musi mieć typ Maybe a -> [a], a nie może mieć np. Maybe -> [a]?

Tak jak typy służą m. in. weryfikacji wyrażeń, tak rodzaje (kinds) służą weryfikacji poprawności typów.

Int :: *

Maybe     :: * -> *
Maybe Int :: *

Można, podobnie jak z funkcjami, stwożyć parametryczne typy wyższego rzędu. Przykład pochodzi z wykładu Simona Peytona Jonesa o typach w Haskellu.

Drzewo "wielogałęziowe" ("różane") vs. drzewo binarne:

data BinTree a = BLeaf a | BNode (Pair (BinTree a))

data RoseTree a = RLeaf a | RNode [RoseTree a]
-- data RoseTree a = RLeaf a | RNode ([] (RoseTree a))

data Pair a = MkPair a a

Można wyjąć z nich typ wyższego rzędu:

data Tree f a = Leaf a | Node (f (Tree f a))

type RoseTree a = Tree [] a
type BinTree  a = Tree Pair a
type AnnTree  a = Tree AnnPair a

data Pair a = P a a
data AnnPair a = AP String a a
  • a - typ liścia
  • f - konstruktor typu kontenera gałęzi
    a    :: *
    f    :: * -> *
    Tree :: (* -> *) -> * -> *
    

results matching ""

    No results matching ""