def monadize(monad): "Decorator for creating a monad." monad.then = lambda s, se: s >= (lambda a: se) monad.__ge__ = monad.bind # >= is Haskell's >>= monad.__lshift__ = func.flip(monad.bind) # << is Haskell's =<< monad.__rshift__ = monad.then # >> is Haskell's >> return monad
"Flipped map_m" return map_m(monad_t, transform, from_list) def for_m_(monad_t, from_list, transform): "Flipped map_m_" return map_m_(monad_t, transform, from_list) @infix.Infix def mcompl(a_to_monad_b, b_to_monad_c): """Left-to-right Kleisli composition.""" return lambda a: (a_to_monad_b(a) >= b_to_monad_c) mcompr = infix.Infix(func.flip(mcompl)) mcompr.__doc__ = "Flipped Kleisli composition." def forever(monad_action): "Repeats a monad action infinitely." return monad_action >> forever(monad_action) def join(monad_of_monads): "Removes a level of monadic structure." return monad_of_monads >= (lambda x: x) def map_and_unzip_m(monad_t, map_function, from_list): """