3

検討

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

これが を使用して簡単に記述できるという事実を無視すると、構文を使用してラムダを単純化elemできると強く感じていますが、正しく理解できません。Arrow

このラムダは、矢印を使用して簡略化できますか? また、矢印がいつ機能するかを「見る」方法と、適切な表現を見つける方法に関する一般的なヒントはありますか?

4

2 に答える 2

7

フォルダーから計算を引き出します-

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)
于 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 に答える