Haskell “如何做并行”;“任何一方”;用“短路”;及;及;或;

Haskell “如何做并行”;“任何一方”;用“短路”;及;及;或;,haskell,parallel-processing,short-circuiting,Haskell,Parallel Processing,Short Circuiting,haskell有一个并行的“and”方法吗 以致 (a `parAnd` b) pand undefined False -> False pand False undefined -> False 当a或b的计算结果为false时(而不是等待另一个),是否会触发a和b的并行计算并返回false 有什么方法可以实现这样的事情吗?这是由Conal Elliott提供的。它在封面下使用unsafePerformIO对不同线程上的a和b和a进行求值,并在其中一个线程生成结果时返

haskell有一个并行的“and”方法吗

以致

(a `parAnd` b)
pand undefined False   -> False
pand False undefined   -> False
当a或b的计算结果为false时(而不是等待另一个),是否会触发a和b的并行计算并返回false


有什么方法可以实现这样的事情吗?

这是由Conal Elliott提供的。它在封面下使用
unsafePerformIO
对不同线程上的
a和
b和
a进行求值,并在其中一个线程生成结果时返回。

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

a `par` b `pseq` (a && b)
但是,如果
b
的计算结果为
False
a
仍然被完全计算

然而,通过为其函数式反应式编程(FRP)实现创建的明确选择操作符,这是可能的。它在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
并且还直接定义了
pand
por
和其他类似的交换函数,以便

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

根据文档,amb“在单独的线程中”评估其参数。这是否意味着创建线程(以及所有相关的开销)实际上比使用spark pool要花时间?哦,没关系,我明白了。如果任务足够小,可以考虑使用线程的开销,那么首先就没有理由使用UNAB。由于其严格的属性,它甚至对“一侧”快速的任务也很有用。