Share Pastebin
Guest
Public paste!

Marcelo

By: a guest | Feb 3rd, 2010 | Syntax: Python | Size: 0.87 KB | Hits: 193 | Expires: Never
Copy text to clipboard
  1.  
  2. #!/usr/local/bin/python
  3.  
  4. class Undefined:
  5.     pass
  6.  
  7. class Maybe:
  8.     def __init__(self, x=Undefined):
  9.         self.value = x
  10.  
  11.     def apply(self, f):
  12.         if not self.is_defined:
  13.             return Maybe()
  14.         else:
  15.             return Maybe(f(self.value))
  16.  
  17.     def __repr__(self):
  18.         if not self.is_defined:
  19.             return '<Undefined>'
  20.         else:
  21.             return repr(self.value)
  22.  
  23.     @property
  24.     def is_defined(self):
  25.         return not self.value is Undefined
  26.  
  27. def monad_aware(f):
  28.     def fprime(x):
  29.         return x.apply(f)
  30.     return fprime
  31.  
  32. if __name__ == '__main__':
  33.  
  34.     @monad_aware
  35.     def double(x):
  36.         return 2*x
  37.  
  38.     x = Maybe()
  39.     print double(x)
  40.     assert(not double(x).is_defined)
  41.  
  42.     x = Maybe(2)
  43.     print double(x)
  44.     assert(double(x).is_defined)
  45.     assert(double(x).value == 4)