Proeftentamen Logisch en Functioneel Programmeren, deel FP

Vraag 1

Geef van de volgende expressie aan wat haar type is.

        filter div [1, 2, 3]
 
  1. [Bool]
  2. [Int -> Bool]
  3. [Int] -> [Bool]
  4. typeringsfout

Vraag 2

Geef aan welke van de definities NIET equivalent is aan deze definitie:

        all p xs = and (map p xs)

A.     all p = and . map p

B.     all p = and (map p)

C.     all p xs = (and . map p) xs

D.     all = \p xs -> and (map p xs)

Vraag 3

Wat is de waarde van onderstaande expressie?

        filter ((/=)0) . (\x -> x`mod` 3)) [12, 10, 72, 4]
 
  1. [False,True,False,True]
  2. [12, 72]
  3. [True,False,True,False]
  4. [10, 4]

Vraag 4

Gegeven is de functie    box :: Char -> String

Wat is het type van onderstaande expressie?

        map box "De zon schijnt"

A.     [Char] -> [String]

B.     [String]

C.     [Char] -> [Char]

D.     String

Vraag 5

Wat is de waarde van onderstaande expressie?

        [ div x y | x <- [10,12,6], y <- [3..4]]
 
A.           [3,4,2,2,3,1]
B.           [0,0,0,0,0,0]
C.           [3,4,2]
D.           [3,2,4,3,2,1]

Vraag 6

Gegeven is het datatype:

        data MyList a = Cons (MyList a) a | Nil

Wat is het type van    Cons ’a’  ?

A.           MyList Char
B.           Char -> MyList Char
C.           a -> MyList a
D.           typeringsfout

Vraag 7

Schrijf een functie die in een lijst van getallen bepaalt welk element het vaakst voorkomt. Je mag aannemen dat de lijst niet leeg is.

    vaakste :: [Int] -> Int

Vraag 8

Gegeven is het volgende datatype:

        data Boom a = Blad | Tak a (Boom a) (Boom a)

Schrijf de functie elemBoom die kijkt of een waarde voorkomt in een boom. Neem aan dat de waardes in de linkerdeelboom van een tak allemaal kleiner zijn dan de waarde in de tak zelf en de waardes in de rechterdeelboom juist groter. Maak gebruik van dat feit om de functie  efficient te maken. Schrijf ook het meest algemene type voor deze functie op. 

Vraag 9

Schrijf length met behulp van foldr. Ofwel vul in de volgende definitie op de plekken waar drie puntjes staan de juiste Helium code in:

length :: [a] -> Int
length = foldr ...  
         where ...

Vraag 10

Gegeven is een datatype om expressies mee te representeren:

        data Expr = Const Int | Var String 
                  | Plus Expr Expr | Maal Expr Expr

Schrijf de functie eval die de waarde van een expressie uitrekent. De waardes van de variabelen worden gegeven door de eerste parameter die namen verbindt aan getallen:

        eval :: [(String, Int)] -> Expr -> Int

Je mag aannemen dat alle variabelen die in de expressie voorkomen een waarde krijgen in de lijst. De functie lookup komt van pas bij het definieren van eval:

        lookupBy :: (a->a->Ordering) -> a -> [(a, b)] -> Maybe b