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)