저는 원자 단위로 수행해야한다고 생각하는 다음 함수를 작성했습니다 (다른 모든 사람들이 동일한 MVar
을 사용하는 한).하스켈 : Atomic IO wrapper/laziness?
atomicIO :: MVar() -> IO a -> IO a
atomicIO mvar io =
do
takeMVar mvar
result <- io
putMVar mvar()
return result
또한
, 내가 이해, 하스켈 IO의 일부 게으른 (예를 들면 .. IORef
들)이다에서, 그래서 실제로이 섹션의 작업을 수행 할 필요가 없다. 수행해야 할 작업을 나열하는 '썽크'(올바른 단어입니까?)를 반환 할 수 있습니다.
중요한 섹션 (즉, 단일 스레드 부품)은 매우 빠릅니다.
그러나 내가 IORef
에 편지를 쓰고 있으며, 결과를 즉시 계산하기를 원하기 때문에 필요할 때 준비가되었습니다. 하지만 전에 말했듯이, MVar
자물쇠를 잡고있을 때 중요한 부분에 갇히고 싶지 않습니다.
result <- io `par` io
또는이
return result `par` result
또는이
result `par` return result
그러나 나는이 일을하지 있는지 확실하지 않습니다. 이들 중 하나가 올바른 접근 방식입니까 아니면 다른 방식입니까? (후자의 두 가지에 대한 나의 관심은 IO()
액션이다. 평행하게 ()
을 평가하는 것은 실제로 어떤 일도하지 않는다).
dave4420 : 'modifyIORef'와 비슷한 방법이 있습니까, 아니면 별도의'readIORef'와'writeIORef'가 필요합니까? – Clinton
(어쨌든 비록 주위에 자물쇠가 있어도별로 중요하지 않다고 생각합니다.) – Clinton
@Clinton 내 편집을 참조하십시오. – dave4420