Let’s implement the classic “Maybe” monad, for simple functions.
#!/usr/local/bin/python
class Undefined:
pass
class Maybe:
def __init__(self, x=Undefined):
self.value = x
def apply(self, f):
if not self.is_defined:
return Maybe()
else:
return Maybe(f(self.value))
def __repr__(self):
if not self.is_defined:
return '<Undefined>'
else:
return repr(self.value)
@property
def is_defined(self):
return not self.value is Undefined
def monad_aware(f):
def fprime(x):
return x.apply(f)
return fprime
if __name__ == '__main__':
@monad_aware
def double(x):
return 2*x
x = Maybe()
print double(x)
assert(not double(x).is_defined)
x = Maybe(2)
print double(x)
assert(double(x).is_defined)
assert(double(x).value == 4)