第34回目:Haskellでテトリス(Part2)2014-11-08筆者:村田こんにちは。今回のテーマはdo記法を用いたモナドの使い方です。モナドと一口に言っても様々なモナドがあります。Maybeモナド、Stateモナド、IOモナド、Writerモナドなどなど。テトリスでは少々IOモナドを使うことになりますので、IOモナドを中心に話を進めていきたいと思います。それではまずモナド関数(モナドを使った関数)の見分け方を覚えましょう。関数の型の調べ方は覚えていますか?ghciというREPLの中で調べることができます。:tの後に関数名を書きます。いくつか関数の型を表示させてみましょう。StringこれらはIOモナド関数です。()を返すモナド関数です。Stringを返すモナド関数です。ほにゃらら」となっている関数がIOモナド関数です。次の関数の例を見てください。Intこれらは純粋関数であってIOモナド関数ではありませんね。それでは前回のGUIサンプルコードを読み込んで、他にもIOモナド関数の例を探してみましょう。()上記も全てIOモナド関数です。最後の例について少し説明します。selfは「型変数」と呼ばれるものです。型変数は小文字で始まります。head関数やmap関数の型定義にあるaやbも型変数です。selfやaは「型」ではなく、型変数は任意の型を扱える「型の変数」として扱われます。他の言語ではジェネリクスとかテンプレートとか、<T>とかそんな感じ。実際の型はBoolとかIntとかIOとか大文字で始まります。部分ですが、selfという型変数に入る実際の型はWidgetClassという「型クラス」に属していることを表しています。今度は型クラス・・・ぬ〜ややこしいですね。型も型クラスも大文字から始まりますが、型と型クラスは全く別モノです。型クラスについて詳しくは説明しませんが、型とは違うモノって覚えておいていただければ良いです。()を返すIOモナド関数ということが分かりますね。他のモナドも見てみましょう。失敗を扱うMaybeモナドってのがあります。Maybeモナド関数がどういう型で定義されるか想像できますか?こんな感じです。=>という型クラス制限は無視してください)次は状態を扱うStateモナド関数の例です。()並列処理を扱うEvalモナド関数の例も見てみましょう。