Haskell第3回 mapからモナドを理解する

  • mapという関数がある
 map f [x1, x2, ..., xn] == [f x1, f x2, ..., f xn]
 map f [x1, x2, ...] == [f x1, f x2, ...]
    • とある
    • リスト[]のすべての要素にfを働かせますよ、という関数である
    • "mapは便利なので,リスト以外の自分の使ったデータ構造にも同じような「データ構造内の各要素に関数を適用するための関数」"を用意する
    • この発想はRでいうところのapply,mapply,lapply...系列の関数と同じ発想
    • ここで、mapがしている仕事は、リスト[]に限定されている
    • mapの型を":type"コマンドで調べてみると
Prelude> :type map
map :: (a -> b) -> [a] -> [b]
      • (a -> b) という入力型がaで出力型がbであるような関数(入力型はなんでもよく、出力型もなんでもよく、入力型と出力型は同じでも違ってもよい、という関数)と、[a] (何かのリスト) を引数として、[b]というリストを返す仕事です、と書いてある
      • リストの要素に(a -> b)処理をして、結果をリストとして返す、という意味
      • リストしか受け取れない…
    • mapがリストにしか使えないので、リストでないものにも使いたい、という気持ちを実現しているのが、fmap関数
Prelude> :type fmap
fmap :: Functor f => (a -> b) -> f a -> f b
    • (a -> b) を (f a -> f b)に引き写すのは、圏論の関手(Functor)そのもの