Skip to content

Instantly share code, notes, and snippets.

@zeeshanlakhani
Created October 13, 2011 15:49
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save zeeshanlakhani/1284589 to your computer and use it in GitHub Desktop.
Save zeeshanlakhani/1284589 to your computer and use it in GitHub Desktop.
Python Monoid
#Code from http://fmota.eu/, great!
class Monoid:
def __init__(self, null, lift, op):
self.null = null
self.lift = lift
self.op = op
def fold(self, xs):
if hasattr(xs, "__fold__"):
return xs.__fold__(self)
else:
return reduce(self.op, (self.lift(x) for x in xs), self.null)
def __call__(self, *args):
return self.fold(args)
def star(self):
return Monoid(self.null, self.lift, self.op)
summ = Monoid(0, lambda x: x, lambda a,b: a+b)
joinm = Monoid('', lambda x: str(x), lambda a,b: a+b)
listm = Monoid([], lambda x: [x], lambda a,b: a+b)
tuplem = Monoid((), lambda x: (x,), lambda a,b: a+b)
lenm = Monoid(0, lambda x: 1, lambda a,b: a+b)
prodm = Monoid(1, lambda x: x, lambda a,b: a*b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment