#======= Decoration ======== def log(f): def g(*args): r = f(*args) print(">> %s %s -> %s" % (str(f).split(" ")[1], str(list(args)), str(r))) return r return g #========= Composition ========= def fix1(f, v): def g(*args): r = f(*([v]+list(args))) return r return g def curry(func, numArgs): if numArgs == 1: return func def f1(v): return curry(fix1(func, v), numArgs-1) return f1 def comp(g,f): def r(*args, **kwargs): return g(f(*args, **kwargs)) return r #======== Operations =========== def add(a, b): return a + b def multi(a, b): return a * b def Monade(): #Monade, (M a -> (a -> M b) -> M a) def returm(x): return [x] def bind(m, f): return returm(list(map(f,m))) return returm, bind