Graham Hutton著「プログラミングHaskell」の第8章関数型パーサーを勉強しています。 本の中にあるソースコードではdo記法などが使えないため、動きません。 サポートページにプログラムがあります。そのプログラムの意味がよくわかりません。 教えていただけないでしょうか。
プログラミングHaskellでHaskellを学んだ私が来ましたよ。 OKWaveにアカウントを作るつもりはないですが。
まず、newtypeで新しい型を定義していると思うのですが、右辺のPというのがなにかわかりません。
また、instance Monad Parser whereやinstance MonadPlus Parser whereの意味もわかりません。 その下で、return, >=, mzero, mplusといった関数を定義する意味もわかりません。 よろしくおねがいします。
この本は、コードを写経して動かしながら学ぼうという向きにはつらくて、「第8章 関数型パーサー」の中に >>= とか return とか do記法とかが出てくるのだけど、そこには嘘があって、きちんとモナドとして定義された型でしかdo記法は使えないはずなのに、モナドとして型を定義する話は第8章にはぜんぜん出てこない。
第8章の頭には
type Parser a = String -> [(a, String)]
って書いてあるけど、これではdo記法は使えないのだ。
じゃあどう定義すればParser型でdo記法が使えるのか、というと、それがダウンロードできるサンプルコードでの定義のやり方なのだけど、この方法は第8章まで読んだだけでは理解できない。なぜなら、型クラスの話は「10.6 クラスとインスタンスの宣言」まで出てこないからだ。
その代わり、第10章まで読めば、
instance Monad Parser whereやinstance MonadPlus Parser whereの意味
とか、
その下で、return, >=, mzero, mplusといった関数を定義する意味
については理解できると思う。
とはいえ、
この本にはMonadPlusの説明なんか1行もでてこないけどな!
しかもしかも、サンプルコードには
newtype Parser a = P (String -> [(a,String)])
って書いてあるけど、
この本にはnewtypeキーワードの説明なんか1行もでてこないけどな!
というわけで、質問者のあなたがわからないのも当然ですわ。この本以外を使って自学するしかないです。
それではあんまりなので、少しだけ説明しましょうか。
- MonadPlus
- モノイドの性質をあわせ持つモナドを表す型クラス。ざっくりいうと、足し算ができるモナド。この本のParser型では、パーサー同士を連結できるという意味。
- newtypeキーワード
- dataキーワードに似た、新しい型を定義する文法。Pは値コンストラクタ。dataキーワードとの違いは、newtypeで定義された値コンストラクタは正格なこと。パターンマッチの動きも違ってくる。
とはいえ、ぶっちゃけこのあたりのことは、この本を読み進める上ではわからなくてもいいです。