Haskell. Po polsku.

Nowinki o funkcyjnym języku programowania Haskell

Używanie funkcji map

z 4 uwagami

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?

Written by gracjanpolak

Listopad 21, 2010 @ 22:09

Napisane w Haskell

Odpowiedzi: 4

Subscribe to comments with RSS.

  1. 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

  2. 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

  3. 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

  4. 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


Dodaj komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Zmień )

Twitter picture

You are commenting using your Twitter account. Log Out / Zmień )

Facebook photo

You are commenting using your Facebook account. Log Out / Zmień )

Connecting to %s

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.