бесконечный цикл в функциональном программировании? - PullRequest
8 голосов
/ 14 августа 2010
  • Мне было интересно: можно ли сделать бесконечные циклы в функциональном программировании?

пример: при использовании Windows API для получения сообщений Windows он обычно реализуется в цикле.

Я знаю, что можно создать функцию, которая будет продолжать входить в рекурсию бесконечно долго.Я ожидаю, что это приведет к переполнению стека.

  • Является ли бесконечный цикл неправильным мышлением для функционального программирования?

  • это интерфейсоперационной системы или оборудования проблема?

мне не кажется, что функциональная программа / операционная система может продолжать работать сама по себе

У меня есть крошечныйнемного опыта написания функциональных программ, но это всегда беспокоило меня.Пожалуйста, поделитесь своими мыслями / идеями по этим вопросам

Ответы [ 4 ]

5 голосов
/ 14 августа 2010

Если вы используете хвостовую рекурсию , вы фактически получаете итерацию, например цикл for / while.Поэтому, я полагаю, вы можете создать бесконечный цикл без переполнения стека.

На ваш вопрос: "Является ли бесконечный цикл неправильным мышлением для функционального программирования?"* может быть, это поможет: - Хотя или хвостовой рекурсии в F #, что использовать, когда?

4 голосов
/ 14 августа 2010

Как уже сообщали другие, бесконечный цикл возможен через хвостовые рекурсии .

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

let loop() = do {
  println("foo")
  loop()
}

Но

- это бесконечный цикл, неправильный настрой для функциональногопрограммирование?

все еще имеет смысл.Рассмотрим пример Windows-API с бесконечным циклом.Это совсем не функционально.Помните - функционал означает мышление в значениях что они означают ).Поэтому лучше использовать реактивный подход, основанный на событиях, подобный этому [Псевдофункциональный код]

  (onClick form1)
|> Event.subscribe (\pt-> do { print $ "I was clicked at " ++ (show pt) })

Так что

это не кажется мне функционаломпрограмма / операционная система может продолжать работать сама по себе

- это технически неправильно - вы можете реализовать бесконечные циклы - но часто нет (функциональной) точки в выполнениитак.Зачем это нужно, кроме какого-то IO-опроса?Преобразование значений чисто функциональным способом должно перестать быть значимым.

1 голос
/ 14 августа 2010

Вы можете иметь бесконечную хвостовую рекурсию , если ваш компилятор ее распознает. Некоторые языки, например схемы, требуют, чтобы компиляторы распознавали хвостовую рекурсию и не выделяли для нее пространство в стеке.

Редактировать Я не хочу не соглашаться с другими ответами, но "бесконечные" хвостовые рекурсивные петли с - это обычная идиома для работы с внешним миром. Следующий пример взят из Real World Haskell и является представителем идиомы.

mainloop :: Handle -> Handle -> IO ()
mainloop inh outh = 
    do ineof <- hIsEOF inh
       if ineof
           then return ()
           else do inpStr <- hGetLine inh
                   hPutStrLn outh (map toUpper inpStr)
                   mainloop inh outh

По сути, мы рассматриваем внешний мир как поток .

0 голосов
/ 16 августа 2010

Большинство, если не все, использования «бесконечных циклов» в функциональном программировании можно смоделировать с помощью совместной рекурсии . До сих пор другие ответы указывали на общую рекурсию, но неограниченное использование рекурсии, возможно, является плохим подходом, поскольку может привести к плохо структурированному коду.

Подавляющее большинство кода в чисто функциональной программе должно быть написано в общем подмножестве, т. Е. Использовать шаблоны, такие как структурная рекурсия или совместная рекурсия (которые обеспечивают завершение и прогресс), а не возвращаться к общей рекурсии. Будем надеяться, что будущие версии GHC будут включать в себя прямую поддержку для обнаружения некоторого общего подмножества Haskell и выдачи предупреждений для кода, который не может быть подтвержден как прекращение или прогресс.

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