raskin,
Verb trains были изобретены Иверсоном и впервые появились именно в APL. Фактически это способ представления дерева композиций в виде
бесскобочного выражения. Особенно здорово оно работает в сочетании с adverbs и conjunctions:
Можно сравнить:
truth_table1 =: #&2 #: [: i. 2&^
truth_table2 =: (] # 2:) #: [: i. 2: ^ ]
truth_table3 =: monad : '((] y.) # (2: y.)) #: (i. (2: y.) ^ (] y.))'
truth_table4 =: monad : '(y. # 2) #: (i. 2 ^ y.)'
truth_table1 3
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Во втором случае verb train прерывается. В третьем случае — традиционный вариант через композицию и скобки над теми же функциями. В четвёртом случае — традиционный вариант над теми же функциями за исключением ] и 2:, поскольку в данном случае (] y.) может быть упрощено до просто y., а функция 2: возвращает 2 для любых аргументов.
Приведу эквивалентный совсем традиционный вариант (комментарии вставил чтобы не заставлять других читателей лезть в словарь, в тебе не сомневаюсь):
gen_elem = (#); // сгенерировать вектор y y .. y с кол-вом элементов x
gen_vect = (i.); // сгенерировать вектор 0..(y-1)
antibase = (#:); // конвертировать y в вектор используя базу из x
right = (]); // взять правый аргумент
two = (2:); // возвращает двойку для любого аргумента
power = (^); // возведение в степень
// тип type - потому что может быть n-мерный массив, необязательно число
type truth_table(type args)
{
return antibase(gen_elem(right(args), 2), gen_vect(power(2, right(args)));
}
// выкинул функцию right, потому что в Java принято
type truth_table_simplified(type x, type y)
{
return antibase(gen_elem(y, 2), gen_vect(power(2, y)));
}
На мой взгляд verb trains очень даже новшество.
Tacit — да, есть аналогия с комбинаторами, но есть отличие: инфиксная запись и коньюнкции. Подозреваю, что как-то можно в хаскеле это эмулировать, но сомневаюсь, что 1-в-1. Если что — готов убедиться в обратном.
Loopless code — возможно хотелка была у многих и возможно давно, но внятной реализации охватывающей сколь нибудь сложный перебор не было. Даже Sisal — ФЯ который проектировался как киллер Фортрана, делает это весьма банально:
b := for initial i := 0;
bvalue := a[0];
while (i < n - 1) repeat
i := old i + 1;
bvalue := old bvalue + a[i];
returns
array of bvalue
end for;
Как видно for в д.с. — не цикл

, а while — это функция которая который выдаёт массив — результат работы цикла, и этот цикл сформулирован
явно.