Объяснение того, “чтобы жениться”

45
задан mergeconflict 18 June 2012 в 13:43
поделиться

2 ответа

Жениться является решением проблемы круговых структур данных. На императивных языках Вы создаете круговую структуру первым созданием некруговой структуры, и затем возвращением и договариванием указатели для добавления зацикливания.

Говорят, что Вы хотели циклический список с двумя элементами с элементами "0" и "1". Казалось бы невозможным создать, потому что, если Вы создаете "1" узел и затем создаете "0" узел для указания на него, Вы не можете тогда возвратиться и договориться "1" узел для указания назад на "0" узел. Таким образом, у Вас есть ситуация курицы-и-яйца, где оба узла должны существовать, прежде чем любой может быть создан.

Вот то, как Вы делаете это в Haskell. Рассмотрите следующее значение:

alternates = x where
   x = 0 : y
   y = 1 : x

На неленивом языке это будет бесконечным циклом из-за незавершенной рекурсии. Но в Haskell отложенные вычисления делают Правильную Вещь: это генерирует циклический список с двумя элементами.

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

при взятии первого элемента списка 'x' оценен вниз к значению (0, & y), где "& y" бит указатель на значение 'y'. Так как 'y' не был оценен, это в настоящее время - преобразователь. При взятии второго элемента списка, компьютер переходит по ссылке от x до этого преобразователя и оценивает его. Это оценивает к (1, & x), или другими словами указатель назад на исходное 'x' значение. Таким образом, у Вас теперь есть циклический список, находящийся в памяти. Программист не должен ремонтировать обратные указатели, потому что механизм отложенных вычислений делает это для Вас.

46
ответ дан Paul Johnson 26 November 2019 в 21:26
поделиться

Это не совсем, что Вы попросили, и это непосредственно не связано с Haskell, но статьей Bruce McAdam , Что Об Обертках Это входит в эту тему в существенной ширине и глубине. Основная идея Bruce состоит в том, чтобы использовать явный связывающий узел оператор под названием ОБЕРТКА вместо неявный связь узла, которая сделана автоматически в Haskell, OCaml и некоторых других языках. Бумага имеет много из интересные примеры , и если Вы интересуетесь связью узла, я думаю, что Вы уйдете с намного лучшим, сопереживают процессу.

11
ответ дан Joel Burget 26 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: