前回に引き続きCommon Lispでモナドの話。今回はそれをマトモにしていこうというテーマ。ちゃんと作れば普通に使えるものができそうな気がしたので。 まずはそもそも前回のモナドがなぜ動くのかから解説してみる。 今までモナドを動的型言語で実装する際にはreturnを如何に実装するかという問題があった。 returnは通常のオーバーロードと違って戻り値が多相になっているため、静的な型情報がないとメソッドを解決できない。 class Monad m where (>>=) :: m a -> (a -> m b) -> m b return :: a -> m a この多相こそがモナドの力を支えている。 ちなみにこの(>>=)とreturnはHaskellの外ではbind/unitと呼ばれることがある。(学術的なコンテクストで使われることが多い?[要出典]) さて、前回のmonadではどうして