{-# LANGUAGE MultiParamTypeClasses, UndecidableInstances, FlexibleInstances, NoImplicitPrelude #-} -- http://www.randomhacks.net/articles/2007/03/15/data-set-monad-haskell-macros -- http://groups.google.com/group/fa.haskell/browse_thread/thread/407a828c2729fdd5/c15ef7d3f7c258c2 import Prelude hiding (return, fail, (>>=)) import qualified Prelude import qualified Data.Set as S class Monad1 m a where return :: a -> m a fail :: String -> m a class (Monad1 m a, Monad1 m b) => Monad2 m a b where (>>=) :: m a -> (a -> m b) -> m b instance (Ord a) => Monad1 S.Set a where return = S.singleton fail _ = S.empty instance (Ord a, Ord b) => Monad2 S.Set a b where m >>= f = (setJoin . S.map f) m where setJoin = S.unions . S.toList setExample = do x <- S.fromList [1,2,4] y <- S.fromList [1,2,4] return (x*y) main = putStrLn $ show setExample