Relax ordenando restrições na computação monádica

existe algum alimento para reflexão.

Quando escrevo código monádico, a mônada impõe a ordem das operações realizadas. Por exemplo, se eu escrever na mônada de E / S:

do a <- doSomething
   b <- doSomethingElse
   return (a + b)

Eu seidoSomething será executado antes dedoSomethingElse.

gora, considere o código equivalente em um idioma como C:

return (doSomething() + doSomethingElse());

A semântica de C na verdade não especifica em que ordem essas duas chamadas de função serão avaliadas; portanto, o compilador é livre para mover as coisas da maneira que deseja

Minha pergunta é esta:Como eu escreveria um código monádico em Haskell que também deixaria essa ordem de avaliação indefinid Idealmente, eu obteria alguns benefícios quando o otimizador do meu compilador olhar o código e começar a mover as coisa

Aqui estão algumas técnicas possíveis que não fazem o trabalho, mas estão no "espírito" certo:

Escreva o código emfunctorial style, isto é, escrevaplus doSomething doSomethingElse e deixarplus agende as chamadas monádicas. Desvantagens: você perde o compartilhamento dos resultados das ações monádicas eplus ainda toma uma decisão sobre quando as coisas acabam sendo avaliadaUsarlazy IO, isso é,unsafeInterleaveIO, que adia o agendamento às demandas preguiçosas da avaliação. Mas preguiçoso é diferente de estrito, com ordem indefinida: em particular, quero que todas as minhas ações monádicas sejam executada IO preguiçoso, combinado com seq'ing imediato de todos os argumentos. Em particular,seq não impõe restrições de pedidos.

esse sentido, quero algo mais flexível do que o pedido monádico, mas menos flexível do que a preguiça tota

questionAnswers(3)

yourAnswerToTheQuestion