Relax restricciones de pedido en computación monádica

He aquí algunos elementos de reflexión

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)

Lo sédoSomething se ejecutará antes quedoSomethingElse.

Ahora, considere el código equivalente en un lenguaje como C:

return (doSomething() + doSomethingElse());

La semántica de C en realidad no especifica en qué orden se evaluarán estas dos llamadas de función, por lo que el compilador es libre de mover las cosas como lo desee.

Mi pregunta es esta: ¿Cómo escribiría código monádico en Haskell que también deja este orden de evaluación sin definir? Idealmente, obtendría algunos beneficios cuando el optimizador de mi compilador mira el código y comienza a mover las cosas.

Aquí hay algunas técnicas posibles que no hacen el trabajo, pero están en el "espíritu" correcto:

Escribe el código enfunctorial style, es decir, escribirplus doSomething doSomethingElse y dejaplus programar las llamadas monádicas. Inconvenientes: Pierdes compartir los resultados de las acciones monádicas yplus todavía toma una decisión sobre cuándo las cosas terminan siendo evaluadas.Utilizarlazy IO, es decir,unsafeInterleaveIO, lo que difiere la programación a las demandas vagas de evaluación. Pero la pereza es diferente de la estricta con un orden indefinido: en particular, quiero que se ejecuten todas mis acciones monádicas.Lazy IO, combinado con la secuencia inmediata de todos los argumentos. En particular,seq no impone restricciones de orden.

n este sentido, quiero algo más flexible que el pedido monádico pero menos flexible que la holgazanería total.

Respuestas a la pregunta(3)

Su respuesta a la pregunta