2014-02-28 2 views
1

병렬 & Concurrent Haskell의 책 http://chimera.labs.oreilly.com/books/1230000000929/ch09.html#sec_timeout에서 fmap Just m은 왜 즉각적으로 썽크를 반환하지 않습니다 (시간 제한의 목적을 무효화)?fmap은 IO에 엄격하게 적용됩니까?

IO 뭔가가 특별하며 fmap은 항상 결과를 강요합니까? monad-par 패키지가 NFData을 사용하고 그러한 종류의 AFAIK 동작을 피하도록하면 놀랄 것입니다.

나는 확실히 뭔가를 놓친다. 제발 저를 계몽하십시오.

답변

4

이 대답에서는 IO 연산을 실행하는 과정에서 효과적이고 환경과 상호 작용하는 '계산'이라는 단어를 사용합니다. 용어는 다양합니다.

계산을 fmap Just act으로하면 (실행시) 계산 전체가 act이고 그 다음 결과에만 적용됩니다.

즉시 썽크를 반환하지 않습니다. 이를 수행하려면 계산 act을 썽크에 지연시켜야하며 계산은 썽크에 넣을 수없고 평가 만 할 수는 없습니다. Thunks는 순수한 평가만을 포함하며 그 이유는 정확하게 작동하는 이유입니다. 평가가 연기되는 것이 중요하지 않다는 것을 알고 있기 때문에 평가를 연기하는 것이 좋습니다. 답은 여전히 ​​동일합니다. 이것은 외부 세계와 상호 작용할 수 있고 실행될 때 환경에 따라 다른 대답을 반환 할 수있는 계산 실행에 대해서는 사실이 아닙니다.

프리미티브 (틀림없이 "언어 파괴"프리미티브) unsafePerformIOunsafeInterleaveIO 당신이 전항의 규칙을 깨고 종종 끔찍한 당신이 정말로 원하는 것을 가끔하고 썽크, 내로 IO 계산을 매장 할 수 있도록 생각.

+0

''안전하지 않은''에 게으른 IO 피기 백이 맞습니까? – ron

+1

네, 그렇습니다. 그리고 그것은 '안전하지 않은'것에 달려 있습니다. 대부분의 게으른 IO 항목은'unsafeInterleaveIO'로 구현됩니다. – drquicksilver

+0

다음은 Oleg가 그 주제에 대해 아주 놀랐던 내용입니다 : http://www.haskell.org/pipermail/haskell-cafe/2007-March/023073.html – drquicksilver

관련 문제