如何做并行"任何一方"使用"和"进行短路和"或"

时间:2014-06-14 19:54:38

标签: haskell parallel-processing short-circuiting

haskell是否有并行"和"方法

parAnd :: Bool -> Bool -> Bool

这样

(a `parAnd` b)

会激发并行a和b的评估,并且只要a或b评估为false(而不是等待另一个),就会返回false?

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

2 个答案:

答案 0 :(得分:11)

通常情况下,这是不可能的。你可以做点什么

a `par` b `pseq` (a && b)

但如果b评估为False,则a仍会完全评估。

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

-- | 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

并且还直接定义pandpor和其他类似的交换函数,例如

pand undefined False   -> False
pand False undefined   -> False

答案 1 :(得分:5)

这是由Conal Elliott的unamb package提供的。它使用unsafePerformIO来涵盖不同线程上的a && bb && a,并在产生结果时返回。