dbrattli / OSlash

Functors, Applicatives, And Monads in Python
MIT License
714 stars 50 forks source link

How to convert a plain function into a function that returns a monad with inflix operators #10

Open arnauorriols opened 6 years ago

arnauorriols commented 6 years ago

An example is worth 1000 words:

import oslash

def operation_that_succeeds(input):
    return oslash.Right(input + 1)

def operation_that_fails(input):
    return oslash.Left("Failure")

def lift(m):
    def w(f):
        return lambda x: m.unit(f(x))
    return w

@lift(oslash.Right)
def pure_function(input):
    return input + 1

if __name__ == "__main__":
    print(operation_that_succeeds(45) | operation_that_succeeds | pure_function | operation_that_succeeds)

How can I rewrite this without needing to implement the lift decorator?