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