Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Вроде дыбра

Допилил 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).
Tags: programming
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 6 comments