south37の日記

ちょろっとメモりたい事とかを書く用。もうちょっとちゃんとしたブログもあります。http://south37.hatenablog.com/

すごいHaskellたのしく学ぼう!を読んだ

読み終えての感想

まず間違い無く言えるのは、Haskellを学ぶ上では本当に良い本だと言う事。

(実は、Haskell本としてはプログラミングHaskellって本も以前読んでいた。が、型クラスとか型コンストラクタとかデータコンストラクタとかそういった重要な概念の説明が何も無く、読み終えても何も残らなかった。)

そういった意味では、「すごいH本」はHaskellの様々な要素を読み易い形で説明してくれていて、とても素晴らしかった。Haskellを実用する為に必要な情報が手に入るというか。

感心した点

HakellにはFunctor(関手)Monadのような、圏論で使われてる概念を型クラスとして取り込んでる部分があるんだけど、「すごいH本」は圏論での意味合でいは無く、「Haskellにおける役割」みたいなものをとても丁寧に分かり易く説明していた。

例えば、関手は圏論的には 圏を別の圏に写すもの で、実際Functor型クラスもそういう風に捉える事が出来る。けれども、「すごいH本」としては Functorは関数で写せる文脈付きの値 という立ち位置で捉えるようにしていた。

また、モナド圏論的には unitjoinが定義された自己関手 な訳だけど、「すごいH本」では Monadは普通の関数に食わせる事が出来る文脈付きの値 として捉えられていた(普通の関数と書いたけど、モナドを返すのが条件)。

こういった様々な捉え方はもちろん全て正しい訳だけど、HaskellにおいてFunctorやMonadの機能がどういう風に使われているかを考えた時に、 文脈付きの値 という捉え方はとても自然で、かつ有用だと思った。

「文脈付きの値」という言葉について

一応意味合いを説明しておく。例えばMaybe失敗の可能性のある値 として捉えたり、リスト非確定計算に用いられる値 として捉えたりするのが、「文脈付きの値」の意味するところ。FunctorMonadも基本的に型引数を一つとる「型コンストラクタ」として定義されていて、その引数の型の値に文脈を持たせる役割を果たしている。

Functorfmapを持っていて、普通の関数に文脈付きの値を食わせて文脈付きの値を返す事が出来る。次の例では、1, 2, 3の3つの可能性を持つ文脈付きの値に対して、普通の関数¥x -> x * 2を適用した結果、2, 4, 6の3つの可能性を持つ文脈付きの値が返ってきた事を表している。

ghci> fmap (¥x -> x * 2) [1, 2, 3]
[2, 4, 6]

また、Monadは文脈付きの値を返す関数に、文脈付きの値を食わす事が出来る。

ghci> let largerThan9 x = if x > 9 then Just x else Nothing
ghci> Just 3 >>= largerThan9
Nothing
ghci> Just 11 >>= largerThan9
Just 11

>>=を使って(メソッドチェーンのように)返り値を次々と関数に適用していったり、一連の処理をdo記法を使ってまとめたり出来る。

失敗の可能性、ログ、状態などを値に付属させて綺麗に表現出来る為、「文脈」という概念は優れていると思う。特に、Maybeを最初に知った時は感動した。nullでも0でもfalseでも無く、明確に「失敗」を表現する「値」であるNothingがあるというのは、素晴らしいのでは。

とりあえずまとめ

面白くて読み易いので、「すごいH本」を読んてみよう!

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!