Monad m => Maybe (m (Maybe b))
という型がついている物体の、二つのMaybeをエレガントに統合する方法もとむ
MainRand.hs
recMapM :: forall a b m. (Data a, Data b, Monad m) => (b -> m b) -> a -> m a
recMapM f x = do
let recurse = gmapM (recMapM f) x
case cast x of
Nothing -> recurse
Just bx -> do
z <- f bx
case cast z of
Nothing -> recurse
Just az -> return az
c.f.
http://d.hatena.ne.jp/nushio/20120104
http://d.hatena.ne.jp/nushio/20120105