3

考虑

foldr (\x (a,b) -> (a || x==2, b || x==7 )) (False,False) [1..6]
--(True,False)

忽略可以使用 轻松编写的事实elem,我有一种强烈的感觉,即我可以使用Arrow语法来简化 lambda,但我就是做错了。

可以使用箭头简化这个 lambda 表达式吗?关于如何“看到”箭头何时起作用以及如何找到正确的表达方式,您是否有任何一般性提示?

4

2 回答 2

7

从文件夹中拉出计算 -

ghci> :m +Control.Arrow
ghci> any (==2) &&& any (==7) $ [1..6]
(True,False)

但是,如果您想确保只遍历列表一次,请尝试使用bifunctor 包

ghci> :m +Data.Bifunctor +Data.Bifunctor.Apply
ghci> foldr (bilift2 (||) (||) . ((==2) &&& (==7))) (False, False) [1..6]
(True,False)
于 2012-03-09T19:38:11.003 回答
6
foldr (\x -> (|| x==2) *** (|| x==7)) (False,False) [1..6]

我不认为你可以x用箭头抽象出来。

编辑:好吧,看起来你可以:

foldr (uncurry (***) . (((||) . (==2)) &&& ((||) . (==7)))) (False,False) [1..6]
于 2012-03-09T15:11:53.130 回答