June 26th, 2015

Book

Вроде дыбра

Допилил ArgumentValues.hs. Как водится у нас, хаскеллистов, ни разу не запускал ещё. Теперь надо или какую-нибудь Test fixture запилить, или сделать сначала второй проход, а потом оба в связке уже погонять.

Суть токова.

надо из let foo x y = y * y + x in (foo a 2) + (foo (b + 3) 2)

сделать

let y = 2 in foo x = y * y + x in (foo a) + foo (b + 3)

Для этого надо сделать 2 прохода. Первый проход идёт "справа налево": собирает фактические параметры во всех местах вызова (аппликациях):

[a, 2]
[b + 3, 2]

и "суммирует" их в специальном моноиде/полурешётке:

[Top, 2]

Top сигнализирует, что "приходит каждый раз разное, и параметр надо оставить как есть".

Далее, результат передаётся в foo, где уже известно, что параметры называются х и y (в месте вызова параметры приходится складывать анонимно по позициям).

Соответственно, в этом месте уже известно, что y можно прибить.

Заменяем foo x y на foo x и записываем, что y теперь 2

Идя далее вниз по дереву вызовов, доходим до y и меняем его с y = ArgNode на y = LetNode [] 2

[] означает, что нет аргументов и y, таким образом, не лямбда.

Собственно, на этом ArgumentValues.hs заканчивает свою работу.

Но у нас остались неубранными аргументы в местах вызова:

let y = 2 in foo x = y * y + x in (foo a 2) + (foo (b + 3) 2)

Для этого надо будет ещё один проход делать (в терминах Hoopl).