Paradygmaty programowania/Test 12: Programowanie funkcyjne w Haskellu III: Różnice pomiędzy wersjami
m (→Test 12) |
|||
Linia 12: | Linia 12: | ||
<quiz type="exclusive"> | <quiz type="exclusive"> | ||
Która lista może wprawić interpreter w nieskończoną zadumę? | Która lista może wprawić interpreter w nieskończoną zadumę? | ||
− | <wrongoption reply="Źle">filter (< 100) (map sz [1..9]) where sz x | + | <wrongoption reply="Źle">filter (< 100) (map sz [1..9]) where sz x = x*x*x</wrongoption> |
− | <wrongoption reply="Źle">map sz [1,2,3,4] where sz x | + | <wrongoption reply="Źle">map sz [1,2,3,4] where sz x = x*x*x</wrongoption> |
− | <wrongoption reply="Źle">takeWhile (< 100) (map sz [1..]) where sz x | + | <wrongoption reply="Źle">takeWhile (< 100) (map sz [1..]) where sz x = x*x*x</wrongoption> |
<rightoption reply="Dobrze">[x*x*x | x <- [1..], x*x*x < 100]</rightoption> | <rightoption reply="Dobrze">[x*x*x | x <- [1..], x*x*x < 100]</rightoption> | ||
</quiz> | </quiz> | ||
Linia 20: | Linia 20: | ||
<quiz type="exclusive"> | <quiz type="exclusive"> | ||
Ile elementów będzie miała lista wyliczona za pomocą wyrażenia | Ile elementów będzie miała lista wyliczona za pomocą wyrażenia | ||
− | takeWhile (> 3) (map kw [-3..3]) where kw x | + | takeWhile (> 3) (map kw [-3..3]) where kw x = x*x? |
<wrongoption reply="Źle">0</wrongoption> | <wrongoption reply="Źle">0</wrongoption> | ||
<wrongoption reply="Źle">1</wrongoption> | <wrongoption reply="Źle">1</wrongoption> | ||
Linia 28: | Linia 28: | ||
<quiz type="exclusive"> | <quiz type="exclusive"> | ||
− | Ile elementów będzie miała lista wyliczona za pomocą wyrażenia filter (> 3) (map kw [-3..3]) where kw x | + | Ile elementów będzie miała lista wyliczona za pomocą wyrażenia filter (> 3) (map kw [-3..3]) where kw x = x*x? |
<wrongoption reply="Źle">0</wrongoption> | <wrongoption reply="Źle">0</wrongoption> | ||
<wrongoption reply="Źle">1</wrongoption> | <wrongoption reply="Źle">1</wrongoption> | ||
Linia 63: | Linia 63: | ||
Która definicja równoważna jest definicji f x = (fst x, snd x)? | Która definicja równoważna jest definicji f x = (fst x, snd x)? | ||
Pomijamy na razie kwestię sygnatury funkcji. | Pomijamy na razie kwestię sygnatury funkcji. | ||
− | <wrongoption reply="Źle">f x y | + | <wrongoption reply="Źle">f x y = x y</wrongoption> |
− | <wrongoption reply="Źle">f x y | + | <wrongoption reply="Źle">f x y = (x, y)</wrongoption> |
− | <wrongoption reply="Źle">f x | + | <wrongoption reply="Źle">f x = (x, x)</wrongoption> |
− | <rightoption reply="Dobrze">f (x, y) | + | <rightoption reply="Dobrze">f (x, y) = (x, y)</rightoption> |
</quiz> | </quiz> | ||
Linia 79: | Linia 79: | ||
<quiz type="exclusive"> | <quiz type="exclusive"> | ||
Typ nazywamy monadą, jeśli: | Typ nazywamy monadą, jeśli: | ||
− | <rightoption reply="Dobrze">istnieją w nim odpowiednie operacje, zwane >> | + | <rightoption reply="Dobrze">istnieją w nim odpowiednie operacje, zwane >>= i return</rightoption> |
<wrongoption reply="Źle">jego nazwa zaczyna się od litery "M"</wrongoption> | <wrongoption reply="Źle">jego nazwa zaczyna się od litery "M"</wrongoption> | ||
<wrongoption reply="Źle">jest zdefiniowany w odrębnym pliku</wrongoption> | <wrongoption reply="Źle">jest zdefiniowany w odrębnym pliku</wrongoption> | ||
<wrongoption reply="Źle">służy do obsługi wejścia-wyjścia</wrongoption> | <wrongoption reply="Źle">służy do obsługi wejścia-wyjścia</wrongoption> | ||
</quiz> | </quiz> |
Aktualna wersja na dzień 22:51, 23 wrz 2006
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