
oleg@pobox.com writes:
Called MonadMinus, it is capable of defining LogicT monad with the true logical negation as well as interleaving and committed choice. Our ICFP05 paper describes MonadMinus monad (actually, the transformer) and LogicT as well as their two implementations.
I just noticed that the Haskell wiki[1] claims that Data.Foldable
generalizes MonadMinus (aka MonadSplit).
[1] http://www.haskell.org/haskellwiki/New_monads
It's true that you can define msplit in terms of foldr, e.g.:
msplit :: (Foldable m, MonadPlus m) => m a -> m (Maybe (a, m a))
msplit a = foldr sk (return Nothing) a
where sk a m = return (Just (a, reflect m))
reflect :: MonadPlus m => m (Maybe (a, m a)) -> m a
reflect m = m >>= maybe mzero (\(a,m') -> return a `mplus` m')
But I can't help but feel that something is being lost.
I was initially skeptical about defining Foldable for the direct-style
LogicT transformer, but now I suspect that it is definable.
--
David Menendez