検討
foldr (\x (a,b) -> (a || x==2, b || x==7 )) (False,False) [1..6]
--(True,False)
これが を使用して簡単に記述できるという事実を無視すると、構文を使用してラムダを単純化elem
できると強く感じていますが、正しく理解できません。Arrow
このラムダは、矢印を使用して簡略化できますか? また、矢印がいつ機能するかを「見る」方法と、適切な表現を見つける方法に関する一般的なヒントはありますか?
フォルダーから計算を引き出します-
ghci> :m +Control.Arrow
ghci> any (==2) &&& any (==7) $ [1..6]
(True,False)
ただし、リストを1回だけトラバースしていることを確認したい場合は、bifunctorパッケージを使用してみてください。
ghci> :m +Data.Bifunctor +Data.Bifunctor.Apply
ghci> foldr (bilift2 (||) (||) . ((==2) &&& (==7))) (False, False) [1..6]
(True,False)
foldr (\x -> (|| x==2) *** (|| x==7)) (False,False) [1..6]
x
矢印で抽象化できるとは思いません。
編集:まあ、あなたができるようです:
foldr (uncurry (***) . (((||) . (==2)) &&& ((||) . (==7)))) (False,False) [1..6]