如何在相同参数上重写条件(提前终止)的组合?
假设我有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)提前终止或任何其他优雅建议的元组.
谢谢
该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,我看不出有什么方法比编写消耗列表中的递归函数更聪明.
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |