Это разумный взгляд на Haskell IO? - PullRequest
7 голосов
/ 24 февраля 2012

Это разумный взгляд на Haskell IO?

При наличии программы среда выполнения Haskell выполняет следующие действия:

  1. Вызывает main, чтобы вернуть "вычисление ввода-вывода"
  2. Затем он выполняет или «запускает» это вычисление, тем самым выполняя все побочные эффекты, которые содержит вычисление.

Этот двухэтапный подход позволяет main оставаться чистой функцией.

В этом случае вычисление ввода-вывода похоже на специальную версию Haskell с явным секвенированием - или, возможно, есть лучший способ описать это?

Ответы [ 2 ]

12 голосов
/ 24 февраля 2012

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

Но в более общем смысле, то, что делает IO, это позволяет вам относиться к императивным программам как к чистымценности.Операции Monad позволяют затем составлять императивные программы из более мелких императивных программ (или использовать обычный в этом контексте термин actions ) и чистые функции.Таким образом, чисто функциональная модель, хотя она не может выполнять императивные программы, все же может описывать их как выражения типа IO a, и компилятор может преобразовать эти описания в императивный код.

Или выМожно сказать так:

  • Компилятор (не среда выполнения) оценивает main.
  • Результатом этой оценки является императивная программа.
  • Эта программа сохраняется в целевом исполняемом файле.
  • Затем вы выполняете целевую программу.

Т.е. часть "оценки main" вашей модели помещается вкомпилятор, и не находится во время выполнения, как вы вначале описали его.

6 голосов
/ 24 февраля 2012

Ваш взгляд на IO хорош, но у меня проблема с этой строкой

Вызывает main, чтобы вернуть "вычисление ввода-вывода"

Лучший способ думать о Haskell - это то, что функции ничего не делают . Скорее, вы декларативно опишите, какие значения являются . Программа состоит из описания значения IO, называемого main. Единственный смысл, который он «называет основным», состоит в том, что объявление main сводится к нормальной форме слабой головы (или что-то подобное).

IO - это тип произвольных вычислений с полным побочным эффектом. Чистое подмножество Haskell - это чисто декларативное описание значений, которое допускает неразрешимые описания. Думайте о Хаскеле как о математическом языке, подобном теории множеств. Утверждения в теории множеств ничего не делают делают , но они могут включать сложные вычисления, такие как "наименьшее множество, которое содержит Akerman's_function (30)". Они также могут содержать неразрешимые операторы, такие как «S = набор всех наборов, которые не содержат себя» *

@ amindfv наполовину прав: main не является «чистой функцией». Это не функция вообще. Это значение, определяемое чистым сокращением, кодирующее неочищенные вычисления.

...