関数じゃなくてもモナドになれる
また、間が開いちゃったんですが、少し前にどんな関数でもモナドになれる件をかいたのですが、今回、さらに一歩進めて、ただの値でもモナドになることを書きたいと思います。
ということでこちら:
newtype V a = V {unv :: a} instance Monad (V) where return a = V a (V v) >>= f = f v
モナド則のほうもちゃんと満足してくれそうですね。
#1 return a >>= k == k a return a >>= k => V a >> k = k a #2 m >>= return == m m >>= return => V a >>= return = V a = m #3 m >>= (\x -> k x >>= h) == (m >>= k) >>= h m >>= (\x -> k x >>= h) => V a >>= (\x -> k x >>= h) => k a >>= h (m >>= k) >>= h => (V a >>= k) >>= h => k a >>= h
といった感じなのですが、なにぶんIntなどの値のモナドなのでKleisli関数(:: a -> m b)はa -> V bといった感じで普通の関数になりますね。
ちなみにこのモナドではdo文では常に最後の計算結果が返り値になります。>>=を使う以外にあんまり使い道はなさそうですね…それですら(.)がすでにありますが…
ではでは。