Paradygmaty programowania/Test 12: Programowanie funkcyjne w Haskellu III
Test 12
Która lista jest w Haskellu niepoprawna?
[1, 2, 4, 8]
[1, 2, 4..8]
[2, 4..]
[2*n+1 | n<-[1,2,4,8]]
Która lista może wprawić interpreter w nieskończoną zadumę?
filter (< 100) (map sz [1..9]) where sz x \= x*x*x
map sz [1,2,3,4] where sz x \= x*x*x
takeWhile (< 100) (map sz [1..]) where sz x \= x*x*x
[x*x*x | x <- [1..], x*x*x < 100]
Ile elementów będzie miała lista wyliczona za pomocą wyrażenia takeWhile (> 3) (map kw [-3..3]) where kw x \= x*x?
0
1
2
4
Ile elementów będzie miała lista wyliczona za pomocą wyrażenia filter (> 3) (map kw [-3..3]) where kw x \= x*x?
0
1
2
4
Haskell najpierw redukuje:
najbardziej wewnętrzny redeks
najbardziej zewnętrzny redeks
najdłuższy redeks
najkrótszy redeks
Załóżmy, że mamy funkcje suma i dl, które podają sumę liczb i długość dla listy liczb. Dlaczego zdefiniowanie funkcji obliczającej średnią za pomocą ilorazu (suma x)/(dl x) jest niepraktyczne?
interpreter musi posiadać dwie kopie reprezentacji listy x
interpreter musi posiadać reprezentację całej listy x
interpreter musi wielokrotnie przeglądać listę x
definicja jest mało czytelna
Do efektywnego obliczenia niektórych funkcji stosuje się "łączenie w n-tki". Umówmy się dodatkowo, że n = 1 oznacza niestosowanie tej techniki. Jakie n musimy wziąć, by obliczać elementy ciągu Fibonacciego w czasie liniowym (względem numeru wyrazu)?
1
2
3
4
Która definicja równoważna jest definicji f x = (fst x, snd x)? Pomijamy na razie kwestię sygnatury funkcji.
f x y \= x y
f x y \= (x, y)
f x \= (x, x)
f (x, y) \= (x, y)
Jak poprawnie określić sygnaturę funkcji f x = (fst x, snd x), by zakres jej stosowania był najszerszy?
a -> a
a -> b
(a, a) -> (a, a)
(a, b) -> (a, b)
Typ nazywamy monadą, jeśli:
istnieją w nim odpowiednie operacje, zwane >>\= i return
jego nazwa zaczyna się od litery "M"
jest zdefiniowany w odrębnym pliku
służy do obsługi wejścia-wyjścia