CPSで書いたmap
30分プログラム、その42。CPSでいろんな再帰関数を書いてみる。
python> fact(id,3) 6 python> append(id,[1,2,3],[4,5,6]) [1,2,3,4,5,6] python> reverse(id,[1,2,3]) [3,2,1] python> map(id,(lambda x:x*x),[1,2,3]) [1,4,9] python> foldr(id,(lambda x,y:x+y),[1,2,3]) 6
def fact(k,n): if n == 0: return k(1) else: return fact((lambda i: k(n * i)),n-1) def append(k,xs,ys): if xs == []: return k(ys) else: return append((lambda zs:k(xs[0:1] + zs)),xs[1:],ys) def reverse(k,xs): if xs == []: return k([]) else: return reverse((lambda ys: k(ys+xs[0:1])),xs[1:]) def map(k,f,xs): if xs == []: return k([]) else: def g(ys): return k([f(xs[0])] + ys) return map(g,f,xs[1:]) def foldr(k,f,init,xs): if xs == []: return k(init) else: def g(ys): return k(f(xs[0],ys)) return foldr(g,f,init,xs[1:]) def id(x): return x print fact(id,10) print append(id,[1,2,3],[4,5,6]) print reverse(id,range(6)) print map(id,(lambda x: x*x),range(6)) print foldr(id,(lambda x,y:x+y),0,range(11))
- いちいちreturnを書く必要があるのが嫌だな
- lambdaが見ずらい