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.