여기는 생각하기에 좋은 음식입니다.모나드 계산에서 주문 제약 조건을 풀어 라
모나드 코드를 작성할 때 모나드는 수행 된 작업에 대해 순서를 지정합니다. 예를 들어, 나는 IO 모나드에서 작성하는 경우 :
do a <- doSomething
b <- doSomethingElse
return (a + b)
나는 doSomething
이 doSomethingElse
전에 실행됩니다 알고있다.
지금, C와 같은 언어에 해당하는 코드를 살펴
return (doSomething() + doSomethingElse());
C의 의미는 실제로이 두 함수 호출이 평가됩니다 주문을 지정하지 않기 때문에 컴파일러는 일을 자유롭게 이동할 수 주위에 기쁘게.
내 질문은 하스켈에이 평가 순서를 정의하지 않은 모나 딕 코드를 쓰려면 어떻게해야합니까? 이상적으로, 필자는 컴파일러의 옵티마이 저가 코드를보고 주위를 움직이기 시작할 때 몇 가지 이점을 얻을 것입니다. 여기
작업이 수행되지 않는 몇 가지 가능한 기술이다,하지만 바로 "정신"에 있습니다- 이 functorial 스타일의 코드를 쓰기 즉,
plus doSomething doSomethingElse
를 작성하고plus
을 할 수있다 모나드 호출을 예약하십시오. 단점 : 모나드 작업 결과에 대한 공유를 잃게되고plus
은 평가가 끝나는 시점에 대한 결정을 내립니다. - 지연된 메시지, 즉
unsafeInterleaveIO
을 사용하면 느린 평가 요구에 따라 일정을 지연시킬 수 있습니다. 그러나 게으른 것은 정의되지 않은 명령과 엄격한 차이가 있습니다. 특히 모든 모나드 액션이 실행되기를 바랍니다. - 지연 인수 (Lazy IO)를 결합하여 모든 인수를 즉시 확인합니다. 특히
seq
은 순서 지정 제한을 부과하지 않습니다.
이 의미에서 나는 모나드 순서보다 유연하지만 풀 아웃 게으름보다 유연함을 원합니다.
왜 모나드가되어야합니까? 왜 정의되지 않은 주문을 시행해야합니까? – x13n
그렇지 않습니다. 정의되지 않은 순서는 최적화 관점에서 가장 바람직합니다. –
게으른 주 또는 ST 모나드를 사용하면 대략 어떻게됩니까? – hammar