haskell是否有并行"和"方法
parAnd :: Bool -> Bool -> Bool
这样
(a `parAnd` b)
会激发并行a和b的评估,并且只要a或b评估为false(而不是等待另一个),就会返回false?
有没有办法实现这样的事情?
答案 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
并且还直接定义pand
,por
和其他类似的交换函数,例如
pand undefined False -> False
pand False undefined -> False
答案 1 :(得分:5)
这是由Conal Elliott的unamb package提供的。它使用unsafePerformIO
来涵盖不同线程上的a && b
和b && a
,并在产生结果时返回。