Funktsionaalprogrammeerimise meetodid

Eksami näidisülesanded


Ülesanne 1

Kirjutada funktsioon natToBin, mis saab argumendiks naturaalarvu ja väljastab selle esituse kahendsüsteemis:
natToBin :: Int -> [Int]
Näiteks:
natToBin 0  ==>  [0]
natToBin 1  ==>  [1]
natToBin 4  ==>  [1,0,0]
natToBin 7  ==>  [1,1,1]


Ülesanne 2

Kirjutada funktsioon takeUntilRep, mis võtab listist elemente kuni esimese korduva elemendini:
takeUntilRep :: Eq a => [a] -> [a]
Näiteks:
takeUntilRep [1,2,3,3]    ==>  [1,2,3]
takeUntilRep [1,2,1,4,2]  ==>  [1,2]
takeUntilRep [1,2,3,4,5]  ==>  [1,2,3,4,5]


Ülesanne 3

Kirjutada funktsioon split2, mis jagab argumentlisti kaheks listiks nii, et esimeses listis on argumentlisti esimene, kolmas, viies jne. element ning teises on argumentlisti teine, neljas, kuues jne element:
      
split2 :: [a] -> ([a], [a])
Näiteks:
split2 [1..10]  ==>  ([1,3,5,7,9],[2,4,6,8,10])
split2 [3,1,4]  ==>  ([3,4],[1])


Ülesanne 4

Olgu funktsioon twice defineeritud järgnevalt:

twice f = f . f

Redutseerida allpool toodud avaldis normaalkujule kasutades normaaljärjekorda / aplikatiivset järjekorda / laiska väärtustamist.

twice twice (+1) 2


Ülesanne 5

Mis on järgneva avaldise väärtus?
(sum . concat . takeWhile (not . null) . iterate tail) [1..3]
Vali üks toodud variantidest:
(a) 6   (b) 10   (c) 14   (d) 18