Używanie funkcji map
Funkcja map każdy element na liście zamienia na inny element, obliczony jako funkcja oryginalnego.
Przykład:
> map (+2) [1,5,10] [3,7,12]
ogólnie:
map f [x1, x2, ...] == [f x1, f x2, ...]
Ciekawą własnością funkcji map jest to, że nie zmienia ona struktury. Znaczy to, że długość listy wynikowej będzie taka sama jak listy-argumentu.
Warto w tym miejscu wspomnieć o dwóch pochodnych funkcji map. Jedna to mapM:
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
która zasadniczo działa tak jak map, ale przy okazji podmiany każdego elementu pozwala na efekty uboczne (w monadzie).
Druga to fmap, funkcja klasy Functor, która jest uogólnieniem powyższej koncepcji do działania na dowolnej strukturze. Przykład:
> fmap (+2) (Nothing) Nothing > fmap (+2) (Just 5) Just 7
Co jeszcze warto wiedzieć o map, fmap, mapM i podobnych?
Jest taka możliwość wykorzystania funkcji map by zmieniała tylko jedną wartość w liście?
NP.
lista = [1,2,3,4] i chcę zmienić 2 na 8
jest taka możliwość?
Max
Styczeń 6, 2011 at 17:18
Potrzebujemy pomocniczej funkcji, co zmienia 2 na 8 a resztę pozostawia tak jak jest:
zmien_2_na_8 2 = 8
zmien_2_na_8 x = x
a potem map:
nowalista = map zmien_2_na_8 lista
nowalista = [1,8,3,4]
gracjanpolak
Styczeń 7, 2011 at 10:17
A jak by wyglądała zapisana definicja.
Np
Main>zmiana 2 3 [1,2]
[1,3]
Mam problemy z napisaniem definicji, która zmieniałaby wybrany element na podany element w liście. Działanie na zasadzie Update. Może zmieniać pierwsza napotkaną liczbę tak jak to robi funkcja delete.
Max
Styczeń 7, 2011 at 10:29
Np. tak:
zmien :: (Eq a) => a -> a -> [a] -> [a]
zmien z_tego na_to = foldr (\x acc -> (if x == z_tego then na_to else x) : acc) []
ynka
Czerwiec 21, 2011 at 0:51