如何在相同参数下编写多个布尔条件的短路连接?

Šef*_*ana 1 haskell

如何在相同参数上重写条件(提前终止)的组合?

假设我有3个条件

cond1 :: Maybe a -> Maybe a -> Maybe Bool
cond2 :: Maybe a -> Maybe a -> Maybe Bool
cond3 :: Maybe a -> Maybe a -> Maybe Bool
Run Code Online (Sandbox Code Playgroud)

result = cond1 x y .&& cond2 x y .&& cond3 x y
Run Code Online (Sandbox Code Playgroud)

.&&Maybe Bool的短路操作在哪里

(.&&):: Maybe Bool -> Maybe Bool -> Maybe Bool
fa .&& fb = do a <- fa; if a then fb else return False
Run Code Online (Sandbox Code Playgroud)

我正在寻找重写,result以便它采用这些条件的列表,[cond1, cond2, cond3]并连续将其应用于(x,y)提前终止或任何其他优雅建议的元组.

谢谢

ama*_*loy 6

Maybe a类型只是一个分心-他们很可能会成为a,因为所有我们想与他们做的就是调用COND ñ他们.

所以,我们有一个清单:

conditions :: [a -> b -> Maybe Bool]
Run Code Online (Sandbox Code Playgroud)

和一个元组:

inputs :: (a, b)
Run Code Online (Sandbox Code Playgroud)

因为我们可以对该列表中的条件做的唯一事情是将它们inputs作为参数调用它们,我们不妨首先执行此操作:

results :: [Maybe Bool]
results = map (($ inputs) . uncurry) conditions
Run Code Online (Sandbox Code Playgroud)

并希望找到一个f,这样

f results :: Maybe Bool
Run Code Online (Sandbox Code Playgroud)

含义

f :: [Maybe Bool] -> Maybe Bool
Run Code Online (Sandbox Code Playgroud)

例如,有一些类型签名的有趣函数

f = fmap and . sequenceA
Run Code Online (Sandbox Code Playgroud)

但这可能比你想要的短一点:如果其中一个条件返回Just False,我们仍然会评估剩余部分,看看是否有任何一个产生Nothing.这可能是也可能不是你想要的; 做一些事情,在短路Just False以及上Nothing,我看不出有什么方法比编写消耗列表中的递归函数更聪明.