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
El truco habitual es usar un lambda
(supongo que sería fun
en Erlang).
Aquí hay un ejemplo usando 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.
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).
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).
- 1. C# pregunta de la pereza
- 2. Cómo emular onLowMemory()?
- 3. Cómo emular Event.timeStamp
- 4. confusión con respecto a la pereza
- 5. Cómo emular CUDA en Windows
- 6. ¿Por qué la pereza va bien con la transparencia referencial?
- 7. pereza y composición de la función (haskell, erlang)
- 8. Javascript: ¿cómo emular la implementación de la cookie del navegador?
- 9. ¿Es posible hacer la anotación @Formula cargada con pereza?
- 10. decodificación de la pereza de una lista con Data.Binary
- 11. ¿Emular una PC vieja?
- 12. ¿Cómo emular 'git stash' en fósil, bzr?
- 13. Cómo emular E/S mapeadas en memoria
- 14. ¿Cómo emular la unión etiquetada en una base de datos?
- 15. ¿Cómo puedo emular la búsqueda de Vim * en GNU Emacs?
- 16. ¿Cómo puedo emular la API de Jquery UI?
- 17. Cómo emular el ancho mínimo en IE8
- 18. Python para emular la cola remota -f?
- 19. Emular una cámara IP
- 20. ¿Cómo puedo emular ": contiene" usando BeautifulSoup?
- 21. Perfectamente emular nullptr
- 22. SECCOMP: ¿Cómo emular malloc, realloc y gratis?
- 23. Cómo emular C# as-operator en Java
- 24. ¿Cómo puedo emular punteros en Haskell?
- 25. Cómo emular a los cierres en c
- 26. Emular Nexus 7
- 27. ¿Cómo funcionan la pereza y la E/S juntas en Haskell?
- 28. Emular objeto predeterminado # inspeccionar Salida?
- 29. Emular ASP.NET autenticación de cookies
- 30. ¿Es posible emular un iframe?