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.
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.
[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]]
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.
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.
. 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.