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 <zednenem@psualum.com> | "In this house, we obey the laws <http://www.eyrie.org/~zednenem> | of thermodynamics!"