関数じゃなくてもモナドになれる

また、間が開いちゃったんですが、少し前にどんな関数でもモナドになれる件をかいたのですが、今回、さらに一歩進めて、ただの値でもモナドになることを書きたいと思います。

ということでこちら:

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文では常に最後の計算結果が返り値になります。>>=を使う以外にあんまり使い道はなさそうですね…それですら(.)がすでにありますが…


ではでは。