Clojure の protocol でモナドを定義したい!! そう思ったけれど、 protocol の仕組み上 return の定義がけっこう難しいのである。 なぜかというと protocol という仕組みは第一引数に依る分岐なので、型クラスのように型に依る分岐ではないからである しかしこれをいい感じに解決する構造を考えた。 まず、 MonadUnit と MonadBind 、 そしてそれらを対応するデータ型に変換する monad-context 関数を持つ Monad protocol を定義する。 たとえば (maybe-context (MonadUnit. 1)) などとすると (Just. 1) が返されるわけである それから、 return a は単に (MonadUnit. a) とする。 そして m >>= k は、もし m が具体的なデータ(つまり、MonadUnit