Re[14]: Размер класса
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 23.06.06 04:39
Оценка: 12 (2)
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 — это функция которая который выдаёт массив — результат работы цикла, и этот цикл сформулирован явно.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.