星の贈り物

(テキスト未定)

2009年4月の日記

2009年4月8日

本物のプログラマはHaskellを使う 第30回掲載

[topic:Haskell]

ITpro に 本物のプログラマはHaskellを使う - 第30回 状態を扱う複数のモナドを合成したRWSモナド が掲載されました。

これまで何回かモナド変換子を使ってモナドを合成する方法について紹介してきました。ですが、複数のモナドの能力を利用するための方法は、何もモナド変換子だけではありません。複数のモナドの能力を持った新たなモナドを定義するというやり方もあります。そこで今回は mtl パッケージの RWS モナドを例に、複数のモナドの機能を持った新たなモナドを定義する方法、及び、モナド変換子を使って合成する場合と比べた「新しくモナドを定義する」やり方の利点、について説明してみることにしました。

実は今回モナド変換子の欠点の一つとして取り上げた「関数従属性に関係する問題」は、関数従属性を使わないようにすることで回避できます。実際、 第28回 のコラムで紹介した monads-tf などでは関数従属性の代わりに型族(あるいは構文糖衣としての関連型)を使った型関数(type function)を使うことで問題の発生を回避しています。ただ、現行の mtl パッケージでは型族ではなく関数従属性が使用されていますし、現在存在する(合成可能な)モナドには関数従属性を使って関数を定義しているものの方が多いでしょう。また、型族についてはコラムで少し触れただけてきちんとした説明はまだ行っていません。なので説明を複雑にしないため、型族のことは一旦忘れて関数従属性を使ったモナドのみを想定して説明することにしました。このあたりについては、いずれ型族について紹介する機会があればその時に触れたいと思います。


2009年4月18日

型レベルプログラミングの会に参加

[topic:Haskell]

型レベルプログラミングの会 にて Haskell, Type Function 派 という演目で発表を行いました。以下に発表資料を置いておきます。 Haskell, Type Function 派 の発表資料 (Keynote) ( PDF ) 。

懇親会で「長さ付きリストに対する型安全な filter 関数は、unsafeCoerce など(邪悪な方法)を使わない限りやはり書けそうにない」ことが確認されたので、その部分は発表前のバージョンに戻しました。また、発表時に質問が挙がっていた全体型族(Total Type Familes)については、GHC Wiki にあった説明を書き足しました(これ以上の情報を求めるなら、論文待ちだと思います)。発表時との資料の違いはそのくらいです。


声なき言葉へ