Hatena::Grouphaskell

猫とC#について書く代わりにHaskellとF#について書くmatarilloの日記 このページをアンテナに追加 RSSフィード

2014-02-17

OKWaveの質問

| 19:25 | OKWaveの質問 - 猫とC#について書く代わりにHaskellとF#について書くmatarilloの日記 のブックマークコメント

Graham Hutton著「プログラミングHaskell」の第8章関数型パーサーを勉強しています。 本の中にあるソースコードではdo記法などが使えないため、動きません。 サポートページにプログラムがあります。そのプログラムの意味がよくわかりません。 教えていただけないでしょうか。

プログラミングHaskell 第8章関数型パーサー | その他(プログラミング)のQ&A【OKWave】

プログラミングHaskellHaskellを学んだ私が来ましたよ。

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で定義された値コンストラクタは正格なこと。パターンマッチの動きも違ってくる。

とはいえ、ぶっちゃけこのあたりのことは、この本を読み進める上ではわからなくてもいいです。