Ваша реализация compose
действительна для Python 3.2, как обсуждалось в комментариях выше.
Большинство функций библиотеки, которые вы дали, имеют эквивалент Python, написанный в документации .
Такие функции, как map
и filter
, уже реализованы в python и также могут быть просто выражены как списки. Python имеет функцию id
, возвращающую идентификатор объекта (в виде целого числа), но функцию id
библиотеки можно выразить как lambda x: x
.
Другие модули, которые могут вас заинтересовать, это itertools
и functools
, в которых есть partial
и reduce
(что аналогично foldl
, но порядок аргументов не тот же).
Вот простые реализации некоторых из них, которые я не нашел в стандартной библиотеке:
from functools import reduce
def flip(f):
if not callable(f):
raise TypeError("Cannot filp a non-callable object")
def result(*args, **kw):
args = list(args)
args.reverse()
return f(*args, **kw)
return result
def ilast(i):
return reduce(lambda _, x: x, i)
def iscanl(f, v, seq):
yield v
for a in seq:
v = f(v, a)
yield v
def scanl(*args, **kw):
return list(iscanl(*args, **kw))
def foldl(*args, **kw):
return ilast(iscanl(*args, **kw))
# Or using reduce
#def foldl(f, v, seq):
# return reduce(f, seq, v)
def iscanr_reverse(f, v, seq):
return iscanl(flip(f), v, seq)
def scanr(*args, **kw):
result = list(iscanr_reverse(*args, **kw))
result.reverse()
return result
def foldr(*args, **kw):
return ilast(iscanr_reverse(*args, **kw))