Ответ 1
Ваша реализация compose
действительна для python 3.2, как описано в комментариях выше.
Большинство функций библиотеки, которую вы дали, имеют эквивалент python, записанный в documentation.
Функции, такие как 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))