Как мне использовать стрелки здесь? - PullRequest
3 голосов
/ 09 марта 2012

Рассмотрим

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

Игнорируя тот факт, что это можно легко написать с помощью elem, у меня есть сильное ощущение, что я могу использовать синтаксис Arrow для упрощения лямбда-выражения, я просто не могусделай это правильно.

Можно ли упростить эту лямбду, используя стрелки?И есть ли у вас какие-либо общие советы о том, как «увидеть», когда стрелки могут работать, и как найти правильное выражение?

Ответы [ 2 ]

7 голосов
/ 09 марта 2012

Вытащить вычисления из фальца -

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)
6 голосов
/ 09 марта 2012
foldr (\x -> (|| x==2) *** (|| x==7)) (False,False) [1..6]

Не думаю, что вы можете абстрагировать x стрелками.

Редактировать: ну, похоже, вы можете:

foldr (uncurry (***) . (((||) . (==2)) &&& ((||) . (==7)))) (False,False) [1..6]
...