aquí hay algo de reflexión.Relajar las restricciones de ordenamiento en el cómputo monádico
Cuando escribo código monádico, la mónada impone el orden en las operaciones realizadas. Por ejemplo, si escribo en la mónada IO:
do a <- doSomething
b <- doSomethingElse
return (a + b)
sé doSomething
se ejecutarán antes doSomethingElse
.
Ahora, consideremos el código equivalente en un lenguaje como C:
return (doSomething() + doSomethingElse());
La semántica de C en realidad no especifica qué orden serán evaluadas estas dos llamadas a la función, por lo que el compilador es libre de moverse cosas todo lo que le plazca.
Mi pregunta es esta: ¿Cómo escribiría el código monádico en Haskell que también deja indefinida esta orden de evaluación? Idealmente, obtendría algunos beneficios cuando el optimizador de mi compilador vea el código y comience a mover las cosas.
Estas son algunas de las técnicas posibles que no hacer el trabajo, pero están en el "espíritu" derecha:
- escribir el código en estilo funtorial, es decir, escribir y dejar que
plus doSomething doSomethingElse
plus
programar las llamadas monádicas. Inconvenientes: pierde el intercambio de los resultados de las acciones monádicas, yplus
todavía toma una decisión sobre cuándo se evalúan las cosas. - Use lazy IO, es decir,
unsafeInterleaveIO
, que difiere la programación de las demandas de evaluación. Pero perezoso es diferente de estricto con un orden indefinido: en particular, quiero que se ejecuten todas mis acciones monádicas. - Lazy IO, combinado con la selección inmediata de todos los argumentos. En particular,
seq
no impone restricciones de ordenamiento.
En este sentido, quiero algo más flexible que el ordenamiento monádico pero menos flexible que la holgazanería total.
¿Por qué tiene que ser monádico? ¿Y por qué necesitas imponer un orden indefinido? – x13n
No es así. El orden no definido es principalmente deseable desde un punto de vista de optimización. –
¿No es esto más o menos lo que sucede si usa las mónadas estatales o de ST perezosas? – hammar