왜 표준 샘플 코드의 모든 부분이 필요한지 이해하려고 노력하고 있습니다.하스켈에서 '파'와 'seq'또는 'pseq'가 필요한 이유는 무엇입니까?
a `par` b `pseq` a+b
다음 코드로 충분하지 않은 이유는 무엇입니까?
a `par` b `par` a+b
위의 표현식은 매우 설명적인 것처럼 보입니다. a
와 b
을 병렬로 평가하고 결과 a+b
를 리턴하십시오. 효율성의 이유 일뿐입니다. 두 번째 버전은 한 번에 두 번 대신 두 번 실행됩니다.
다음은 좀 더 간결한 버전은 어떻습니까?
a `par` a+b
원래 표준 코드에서와 같이 b
가 a+b
보다 먼저 평가되는지 확인해야하는 이유는 무엇입니까?
이것은 정확하며이 문제에 대해서는'seq'가 왜 부족한지를 설명합니다. 'seq'는 평가 순서에 대한 보장을하지 않습니다. 'seq b (a + b)'에서'(a + b)'가 평가 될 때'b'가 WHNF에있는 한 주 스레드는'b' 전에'a'를 평가할 수 있습니다. –
필자는 그 인자가'par a (par b (a + b)) '문제를 어떻게 묘사하는지 보지 못합니다. 확실히'a' 또는'b'가 즉시 평가 될 것이고, 해당 불꽃이 휘젓는 것입니다. 다른 스파크는 대단히 살아 있어야 병렬성을 생성 할 수 있습니다. 물론 스파크를 만들어내는 것이 가장 효율적인 방법은 아닐지 모르지만 컴파일러에게 평가 순서 질문을 남깁니다. – gereeter
'par a (a + b)'의 경우 런타임이 대신에'b'를 먼저 선택하면 "행운"병렬 처리가 가능합니다. 그러면 'a'스파크가 울리지 않을 것입니다. 이것은 PDF : community.haskell.org/~simonmar/papers/threadscope.pdf (2 페이지)에 언급되어 있습니다. – CMCDragonkai