我如何在这里使用箭头?

Lan*_*dei 3 haskell arrows

考虑

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

忽略这个可以轻松使用的事实elem,我有强烈的感觉,我可以使用Arrow语法来简化lambda,我只是无法正确使用它.

这个lambda可以用箭头简化吗?你是否有任何关于如何"看到"箭头可能工作的一般提示,以及如何找到正确的表达方式?

ram*_*ion 7

将计算拉出折叠器 -

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

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

ghci> :m +Data.Bifunctor +Data.Bifunctor.Apply
ghci> foldr (bilift2 (||) (||) . ((==2) &&& (==7))) (False, False) [1..6]
(True,False)
Run Code Online (Sandbox Code Playgroud)

  • 或者更短:`elem 2 &&& elem 7 $ [1..6]` (2认同)

Sjo*_*her 6

foldr (\x -> (|| x==2) *** (|| x==7)) (False,False) [1..6]
Run Code Online (Sandbox Code Playgroud)

我认为你不能x用箭头抽出来.

编辑:好吧,好像你可以:

foldr (uncurry (***) . (((||) . (==2)) &&& ((||) . (==7)))) (False,False) [1..6]
Run Code Online (Sandbox Code Playgroud)

  • `(||)`是一个被香蕉括号包围的空表达式吗?;-) (3认同)