準備 モナドを作るには、どんなモナドを作りたいか考える。モナドは一般に、どのようなアクションが使えるかによって特徴付けられる。その点ではオブジェクト指向におけるインターフェイスとよく似ている。 では、foo :: String -> M Boolとbar :: M Intという二種類のアクションを持つモナドを作るとしよう。まず、どんなアクションが使えるかを表すデータ型を定義する。 {-# LANGUAGE GADTs #-} data MBase x where Foo :: String -> MBase Bool Bar :: MBase Int GADT(一般化代数的データ型)の各データコンストラクタがアクションに対応する。GADTsを使ったことがなくても心配してはいけない。引数の型と結果の型に着目しよう。 モナドにする monad-skeletonをインストールする。 $ stac