如何用"和"与"或"并行"双方"短路

dsp*_*pyz 10 parallel-processing haskell short-circuiting

haskell是否具有并行"和"方法

parAnd :: Bool -> Bool -> Bool
Run Code Online (Sandbox Code Playgroud)

这样的

(a `parAnd` b)
Run Code Online (Sandbox Code Playgroud)

一旦a或b评估为假(并且不等待另一个),将并行激发a和b的并行评估并返回false?

有没有办法实现这样的事情?

Pet*_*lák 11

通常,这是不可能的.你可以做点什么

a `par` b `pseq` (a && b)
Run Code Online (Sandbox Code Playgroud)

但如果b评估False,a仍然完全评估.

但是,这可以通过Conal Elliott为其功能反应式编程(FRP)实现创建的明确选择运算符实现.它可以作为unamb包在Hackage上使用,并且完全符合您的要求.特别是,它包含

-- | Turn a binary commutative operation into one that tries both orders in
-- parallel. Useful when there are special cases that don't require
-- evaluating both arguments.
-- ...
parCommute :: (a -> a -> b) -> a -> a -> b
Run Code Online (Sandbox Code Playgroud)

并且还直接定义pand,por以及其他类似的交换功能,使得

pand undefined False   -> False
pand False undefined   -> False
Run Code Online (Sandbox Code Playgroud)


GS *_*ica 5

这是由Conal Elliott的unamb包提供的.它使用unsafePerformIO下盖,以评估两者a && bb && a在单独的线程,并且当任一产生一个结果返回.