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が見ずらい