7

Estaba viendo una entrevista con John Hughes y le preguntaron si extrañaba la pereza cuando cambió de Haskell a Erlang. Como respuesta, dijo que sí y usó herramientas para "emularlo". Mi pregunta es: ¿cómo se puede emular la pereza en un lenguaje estricto? Sería bueno ver ejemplos de enfriar en los principales idiomas.Cómo emular la pereza

Respuesta

7

El truco habitual es usar un lambda (supongo que sería fun en Erlang).

Aquí hay un ejemplo usando Ruby:

Monad equivalent in Ruby

La idea básica es bastante simple ... Usted toma cualquiera que sea la expresión desea hacer perezoso, envolverlo en una función anónima sin argumentos, a continuación, evalúa esa función cuando quieras forzarla.

1

Es posible que desee ver los generadores de pitón en detalle.

En resumen, se trata de objetos que tienen un mensaje __next__, que les permite ceder un elemento. Como tales, se pueden componer, de modo que el procesamiento en cada paso extraiga un elemento del siguiente generador compuesto.

De esta forma, los programadores de python pueden trabajar fácilmente con secuencias infinitas (o secuencias de longitud uno).

2

Si solo desea emular el rigor no estricto, todo lo que necesita es ajustar una expresión a una función e invocarla cuando sea necesario.

Si realmente desea emular la pereza (es decir, la falta de rigor con la memorización), debe ajustar esa función en una referencia mutable. Bosquejo en OCaml (excepciones ignorando):

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 

Excepto que OCaml ya tiene esta predefinido en su biblioteca (de una manera que también se ocupa de excepciones de f).