Rekurzív algebrai adattípusok

Példa: Természetes számok

A következő algebrai adatszerkezet rekurzív:

data Nat  
    = Zero          -- nulla
    | Succ Nat      -- rákövetkező
        deriving (Eq, Show, Data, Typeable)

Feladat: Konstansok [*]

Definiáljuk a következő konstansokat:

one :: Nat
two :: Nat

Test>
Succ Zero :: Nat
Test>
Succ (Succ Zero) :: Nat

Feladat: Összeadás [*]

Definiáljuk az összeadást:

add :: Nat -> Nat -> Nat

Test>
Succ (Succ Zero) :: Nat

Segítség:

RecursiveData5cf1703c9dd7cea7ad083c09a978b79f.png

Feladat: Szorzás [*]

Definiáljuk a szorzást:

mul :: Nat -> Nat -> Nat

Test>
Succ (Succ (Succ (Succ Zero))) :: Nat

Segítség:

RecursiveDatab55e074467d107934f2e0eb6b1280158.png

Feladat: Bináris számok

Definiáljuk a pozitív bináris számokat! Egy pozitív bináris szám


Test>
Test>
Test>

Feladat: Bináris számok interpretálása

Definiáljuk a bináris számok jelentését!

fromBin :: Bin -> Integer

Test>
5 :: Integer

Példa: A lista típus

A Preludben a speciális szintaxistól eltekintve így lehetne definiálni:

data List a           -- [a]
   = Nil              -- []
   | Cons a (List a)  -- a : [a]

Feladat: Bináris fa

Definiáljunk egy bináris fa adatszerkezetet, ami a csomópontokban adatot tartalmaz!


Test>
Leaf :: Tree a
Node :: Tree a -> a -> Tree a -> Tree a

Feladat: Fa tükrözése

mirror :: Tree a -> Tree a

Test>
Node Leaf 'x' (Node Leaf 'y' Leaf) :: Tree Char

Feladat: Sokfelé ágazó fa


Test>
T 'x' [] :: T Char