Pythonにはpartialという関数がある。
from functools import partialdef f(x, y):
return x - yg = partial(f, 3)
print g(2) # 1
「マハリクマハリタ」って呪文をかけると、f(x, y)がg(x) = f(3, x)という関数になる。カリー化っていうやつですね。こうすると、
from functools import partialdef f(x, y):
return x - yh = partial(f, y = 3)
print h(2) # -1
固定する変数を指定できて、h(x) = f(x, 3)とできる。
これを使うと、
Map(f, [ a1, a2, a3, ... ]) = [ f(a1), f(a2), f(a3), ...]
と定義されるMapが使える。
def Map(f, l):
while True:
yield f(l.next())
from math import *
from functools import partialdef Repeat(f, a):
yield a
while True:
a = f(a)
yield adef Map(f, l):
while True:
yield f(l.next())def halve(x):
return x / 2def easydiff(f, x, h):
return (f(x + h) - f(x)) / hdef differentiate(h0, f, x):
return Map(partial(easydiff, f, x), Repeat(halve, h0))def within(eps, l):
b = l.next()
while True:
a = b
b = l.next()
if abs(a - b) <= eps:
return bdef diff(eps, f, x):
return within(eps, differentiate(1.0, f, x))def f(x):
return sqrt(x * x + x + 1)x = 1.0
eps = 1e-7
print diff(eps, f, x)
print sqrt(3) / 2 # reference