考虑
foldr (\x (a,b) -> (a || x==2, b || x==7 )) (False,False) [1..6]
--(True,False)
忽略使用elem
可以轻松编写这一事实的事实,我强烈感觉我可以使用Arrow
语法来简化lambda,我无法正确理解它。
这个lambda可以用箭头简化吗?你是否有任何关于如何“看到”箭头可能工作的一般提示,以及如何找到正确的表达方式?
答案 0 :(得分:7)
将计算拉出折叠器 -
ghci> :m +Control.Arrow
ghci> any (==2) &&& any (==7) $ [1..6]
(True,False)
但是,如果您想确保只浏览一次列表,请尝试使用bifunctor package:
ghci> :m +Data.Bifunctor +Data.Bifunctor.Apply
ghci> foldr (bilift2 (||) (||) . ((==2) &&& (==7))) (False, False) [1..6]
(True,False)
答案 1 :(得分:6)
foldr (\x -> (|| x==2) *** (|| x==7)) (False,False) [1..6]
我认为你不能用箭头抽出x
。
编辑:好吧,好像你可以:
foldr (uncurry (***) . (((||) . (==2)) &&& ((||) . (==7)))) (False,False) [1..6]