Mapowanie listy funkcji

Odpowiedz Nowy wątek
2011-09-04 12:05
0

Mam listę funkcji powstałą poprzez:

map (^) [1..10]

I chciał bym do każdej z nich stworzyć listę wartości dla listy [1..12]. Próbowałem tak:

map . (map (^) [1..10]) $ map . [1..12]

Ale nie działało.

Pozostało 580 znaków

2011-09-04 13:12
haskell gimbus
0
 [f x | x <- [1..12], f <- map (^) [1..10]]

No chyba że wolisz gotową tablicę tablic:

[[f x | x <- [1..12] ] | f <- map (^) [1..10]]

Pozostało 580 znaków

2011-09-04 13:18
ofidyfil

Nadal nie zwracasz uwagi na typy. . to złożenie funkcji, matymatyczne, jego wynikiem jest kolejna funkcja. $ to aplikacja funkcji, aplikuje wartość z prawej strony do funkcji po lewej stronie, jej wynikiem jest wartość funkcji.

Najbardziej bezpośrednia postać:

map (\f -> map f [1..12]) $ map (^) [1..10]

Co można przekształcić na wiele sposobów, można np. rozpisać każdą kolejną aplikację:

map ($ [1..12]) $ map map $ map (^) [1..10]

albo usunąć lambdę za pomocą flip:

map (flip map [1..12]) $ map (^) [1..10]

lub sekcji z map użytego jako operator:

map (`map` [1..12]) $ map (^) [1..10]

@haskell gimbus, to przede wszystkim nie są tablice, z postu jasno wynika, że chodzi o drugą postać. List comprehension to nienajlepszy pomysł jeśli skupiamy się na funkcjach wyższego rzędu.

Pozostało 580 znaków

2011-09-04 13:40
0

Starałem się zwrócić uwagę. Miało wyjść tak coś a la:

map (map . [1..12]) (map (^) [1..10])

Mi się wydaje, że to to samo co ostatnia zaproponowana przez ciebie funkcja.

Pozostało 580 znaków

2011-09-04 13:49
ofidyfil
0

. służy komponowaniu FUNKCJI, po prawej stronie masz LISTĘ. . jest typu (b -> c) -> (a -> b) -> (a -> c), gdzie masz "to samo", na jakiej zasadzie to ma zadziałać? Lista jest drugim argumentem map, . dotyczy co najwyżej aplikacji dodatkowej funkcji na pierwszym.

W ogóle całość sprowadza się do ogólnej funkcji typu [a] -> [a -> b] -> [[b]]:

zuo = map . flip map

W Haskellu każda funkcja jest funkcją jednej zmiennej, co najwyżej jej wynikiem jest kolejna funkcja. Dzięki . następuje związanie listy wartości do przetworzenia z "wewnętrznym" map, który staje się argumentem zewnętrznego map, ten zaś "produkuje" funkcję oczekującą listy funkcji:

map . flip map
=> \xs fs -> ((map . flip map) xs) fs
=> \xs fs -> ((\ys-> map (flip map ys)) xs) fs
=> \xs fs -> (map (flip map xs)) fs
=> \xs fs -> (map (\f -> map f xs)) fs
=> \xs fs -> map (\f -> map f xs) fs
=> \xs fs -> map (\f -> f `map` xs) fs

Jaśniej? Napisz, gdzie są niejasności.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0