Как подражать лени - PullRequest
       39

Как подражать лени

7 голосов
/ 14 июня 2011

Я смотрел интервью с Джоном Хьюзом, и его спросили, пропустил ли он лень, когда перешел с Хаскелла на Эрланг.В ответ он сказал «да» и использовал инструменты для «подражания» ему.Мой вопрос: как подражать лени на строгом языке?Было бы неплохо увидеть примеры охлаждения на основных языках.

Ответы [ 3 ]

7 голосов
/ 14 июня 2011

Обычный трюк - использовать lambda (я полагаю, это будет fun в Эрланге).

Вот пример использования Ruby:

Эквивалент монады в рубине

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

2 голосов
/ 27 января 2012

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

Если вы действительно хотите эмулировать лень (то есть нестрогость с запоминанием), то вам нужно обернуть эту функцию в изменчивую ссылку. Эскиз в OCaml (без учета исключений):

type 'a lazy = 'a thunk ref
and 'a thunk = Lazy of unit -> 'a | Memo of 'a

let lazy f = ref (Lazy f)
let force l = match !l with
  | Lazy f -> let x = f () in l := Memo x; x
  | Memo x -> x

За исключением того, что OCaml уже имеет это предопределенное значение в своей библиотеке (таким образом, что также обрабатывает исключения из f).

1 голос
/ 27 января 2012

Вы можете подробнее рассмотреть генераторы python.

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

Таким образом, программисты на Python могут легко работать с бесконечными последовательностями (или последовательностями длины один).

...