В первой главе определяется маленькая библиотека полезных функций высшего порядка combinatorial.py
с таким содержимым:
from operator import mul, add, truth
apply_each = lambda fns, args=: map(apply, fns, *len(fns))
bools = lambda lst: map(truth, lst)
bool_each = lambda fns, args=: bools(apply_each(fns, args))
conjoin = lambda fns, args=: reduce(mul, bool_each(fns, args))
all = lambda fns: lambda arg, fns=fns: conjoin(fns, (arg,))
both = lambda f,g: all((f,g))
all3 = lambda f,g,h: all((f,g,h))
and_ = lambda f,g: lambda x, f=f, g=g: f(x) and g(x)
or_ = lambda f,g: lambda x, f=f, g=g: f(x) or g(x)
disjoin = lambda fns, args=: reduce(add, bool_each(fns, args))
some = lambda fns: lambda arg, fns=fns: disjoin(fns, (arg,))
either = lambda f,g: some((f,g))
anyof3 = lambda f,g,h: some((f,g,h))
compose = lambda f,g: lambda x, f=f, g=g: f(g(x))
compose3 = lambda f,g,h: lambda x, f=f, g=g, h=h: f(g(h(x)))
shortcut_all = lambda fns: reduce(and_, fns)
shortcut_some = lambda fns: reduce(or_, fns)
not_ = lambda f: lambda x, f=f: not f(x)
ident = lambda x: x
Используется она в основном для комбинирования функций фильтрации и простых преобразований строк текста. Например:
short_regvals = filter(both(shortline, isRegVal), lines)
shortline = lambda line: len(line) < 25
В книге есть вопрос:
The function ident() would appear to be pointless, since it simply returns whatever value is passed to it. In truth, ident() is an almost indispensable function for a combinatorial collection. Explain the significance of ident().Перевод вкратце: в каких случаях функция ident() из combinatorial.py(определена последней) необходима/незаменима, в чем её значение?
Hint: Suppose you have a list of lines of text, where some of the lines may be empty strings. What filter can you apply to find all the lines that start with a #?
Что-то мне ни один случай её применения в голову не приходит… Есть идеи?