top page > computer > haskell > web_lecture > for_programmer > map_def.html
更新日:
文責: 重城良国

関数map

maps.hs

動作

リストの要素すべてに関数を適用する。

% ghci
Prelude> map (* 3) [5, 3, 4, 9, 1]
[15,9,12,27,3]
Prelude> :m Data.Char
Prelude Data.Char> map toUpper "Hello"
"HELLO"

2項演算子として

Prelude Data.Char> toUpper `map` "Hello"
"HELLO"

のようにしても良い。関数toUpperを文字列"Hello"にmapという形で適用していると見ることができる。($)をmapにおきかえることで引数を単一の要素からリストにすることができる。

toUpper $ 'e'

toUpper `map` "Hello"

関数とリストをとりリストの全要素に関数を適用する。

mapRaw, mapF, mapU :: (a -> b) -> [a] -> [b]

関数の引数と返り値をリストにする。

mapRaw, mapF, mapU :: (a -> b) -> ([a] -> [b])

生の再帰

mapRaw f (x : xs) = f x : mapRaw f xs
mapRaw _ _ = []

要素すべてに関数fを適用した結果は、先頭の値に関数fを適用した結果を残りの要素すべてに関数fを適用した結果に追加したものだ。リストがx : xsにマッチしない、つまり空リストに対しては空リストを返す。

関数foldr

リストをとる関数としてたたみこみによって定義する。

mapF f = foldr ((:) . f) []

(:) . fは以下のように導き出す。

\x xs -> f x : xs

\x xs -> (:) (f x) xs

\x -> (:) $ f x

(:) . f

xに関数fを適用したものをxsに追加している。関数foldrの第1引数は関数であり、その関数の第2引数xsは再帰的に関数を適用した結果である。mapRaw関数の定義のmapRaw f xsがその関数の第2引数xsとなる。

関数unfoldr

リストを返す関数として関数unfoldrで定義する。

mapU f = unfoldr $ \l -> case l of
x : xs -> Just (f x, xs)
_ -> Nothing

先頭の要素に関数fを適用した値を結果としながらリストを削っていく。x : xsにマッチさせたうえでxsとすることによってリストの先頭の値を落とす。

まとめ

関数型言語といえばmapだ。生の再帰で、関数foldrで、関数unfoldrで、それぞれ定義した。抽象化の層構造をイメージする。層構造の途中で関数foldrとunfoldrに分岐し、そのうえの関数mapで合流する。

「リストを扱う関数の定義について」へもどる 「関数filter, partition」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics