Haskellを勉強していて面白いなと思ったことをメモしておく。
普通の日本語では全然違う言葉
- コンテナ:箱、入れ物、何かを格納するもの
- 文脈:状況、背景、前後関係
普通に生活していたら全く別の意味で使う単語。
でもHaskellの抽象世界では同じものを指している
Haskellの型 f a
を考えると、これは「型 a
が何かに包まれている」状態を表している。
-
Maybe a
: 値があるかもしれない or ないかもしれない → "存在有無という文脈" -
[a]
: 複数の値 → "複数性という文脈" -
Either e a
: 成功 or 失敗 → "エラー処理の文脈" -
IO a
: 副作用のある計算 → "外部世界という文脈"
こう見ると、すべて "何らかの状況の中にある a
" になっている。
fmapが意味すること
この状態で fmap :: (a -> b) -> f a -> f b
を使うと、
-
普通の関数
(a -> b)
を -
文脈/コンテナの中身
a
に適用して、 -
同じ文脈/コンテナの形のまま
b
に変換してくれる。
つまり、文脈の中に入った値を安全に変換する仕組み。これを "lifting" と呼んだりもする。
面白いポイント
普通の言葉なら全然違う "文脈" と "コンテナ" が、
Haskellの抽象度の高い世界では、実質的に同じものを指してしまう
というのがすごく面白いと思った。
Haskellが "抽象の楽園" と言われる理由の一端を感じた気がする。