Estaba leyendo un tutorial de Haskell (Learn You a Haskell) en el que el autor dijo que la pereza va bien con la transparencia referencial. Después de leer más y buscar algo, todavía no entiendo por qué. Tenga en cuenta que entiendo lo bueno de la transparencia referencial y la pereza, pero son ellos los que me preocupan.¿Por qué la pereza va bien con la transparencia referencial?
¿Hay algún beneficio especial de la combinación de los dos?
O tal vez el autor solo quería decir que ambos son agradables de tener y expresó eso ambiguamente?
"el estado solo es necesario en la tercera línea". Esto no es estrictamente cierto. El efecto secundario de haber pedido al sistema la hora actual es necesario para ejecutar la segunda línea; es del tipo 'IO a', no' a'. runBenchmarkFunction es del tipo similar, y para ejecutar ambos, debes combinarlos con alguna función que asegure que las acciones se ejecutan en orden, '>>' en Haskell. Entonces realmente estás escribiendo 'currentTime >> = \ st -> runBenchmarkFunction >> currentTime >> = \ end -> putStrLn" tardó "++ (show $ end - st) ++" seconds "'. Claramente, la segunda línea depende de la primera, por lo que todo funciona. – jrockway
@jrockway: Estoy usando aquí un lenguaje ficticio que podría llamar "Java perezoso" como un ejemplo muy crudo y fácil de explicar la conexión entre la pereza y la transparencia referencial. Cómo se resuelve el problema en Haskell es una ** pregunta ** completamente diferente. Tenga en cuenta que el "modo de la mónada" de Haskell no es la única posibilidad, p. Clean usa su sistema de tipos para lidiar con este problema. – Landei
La pregunta está etiquetada con "haskell". Pero aún así, lo que has escrito es perfectamente referencialmente transparente si imaginas la semántica correcta. Y, si imaginas otra semántica, entonces no lo es. Pero la palabra clave allí es "imaginar". – jrockway