Mapowanie listy funkcji

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.

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]]
0

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.

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.

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.

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