как реализовать функции со скрытыми аргументами в функциональном программировании? - PullRequest
0 голосов
/ 07 апреля 2011

Я пытаюсь научиться функциональному программированию на Lua.У меня есть опыт Java.Я хочу построить Цепочку, используя рекурсивный метод.В Java я сделал бы это как-то так:

//Java
public Link buildChain() {
    return buildChain(null, 0, 100);
}


private Link buildChain(Link parentLink, int count, int length) {

    Link link = new Link();
    link.setParentLink(parentLink);
    if(count != length) {
        link.setChildLink(buildChain(link, count+1, length));
    }

    return link;
}

И, очевидно, у меня был бы некоторый класс Link.

Теперь, как мне реализовать это в функциональном стиле?Этот класс Link будет таблицей (в Lua), хранящей родительскую и дочернюю ссылку и все остальное, что нужно для ссылки.Но как бы я сделал две функции?Буду ли я использовать замыкание (хотя закрытый метод не использует локальные переменные общедоступных) или вид перевернутого каррирования?Или просто сопоставление с образцом?

Буду очень признателен за любые советы и объяснения.О, и мне было трудно найти название для этого вопроса - если у вас есть идея получше, скажите, пожалуйста.

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Я не думаю, что в этом ответе есть что-то «функциональное», но вот как я бы это сделал в Lua. Поле «id» в каждой ссылке просто для предоставления уникального идентификатора:

function buildChain(link, cnt, len)
  cnt = cnt or some_global_default_cnt or 0
  len = len or some_global_default_len or 100
  link = link or { parent=nil, child=nil, id="Link " .. cnt }

  if cnt < len then 
    link.child = buildChain({parent=link, child=nil, id="Link " .. cnt+1 }, 
                            cnt+1, len)
  end

  return link 
end

n = buildChain()
0 голосов
/ 07 апреля 2011

Не уверен, каков синтаксис lua, но у вас есть 2 варианта, в зависимости от того, хотите ли вы, чтобы рабочая функция использовалась также в других контекстах.

Если рабочая функция (вторая) может быть полезна сама по себе, напишите 2 независимые функции. В зависимости от языка это может означать использование двух разных имен.

Или же, сделайте вторую функцию локальной по отношению к первой, как в этом коде haskelish:

buildChain = worker [] 0 100 where
   worker parent count link = ....

Оказывается, что, по крайней мере в Haskell, buildChain на самом деле не является функцией. Это также верно для всех других чистых языков: поскольку работник вызывается с 3 постоянными аргументами, результат всегда будет одинаковым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...