Ответ 1
Обычно это невозможно. Вы можете сделать что-то вроде
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