Paradygmaty programowania/Test 12: Programowanie funkcyjne w Haskellu III

From Studia Informatyczne

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