foldr (\x (a,b) -> (a || x==2, b || x==7)) (False,False) [1..6]
--(True,False)
忽略了一個事實,這可以很容易地使用elem
寫的,我有我可以採用Arrow
語法簡化拉姆達的強烈的感覺,我只是無法得到它的權利。
這個lambda可以用箭頭簡化嗎?你有什麼關於如何「看」箭頭可能工作的一般提示,以及如何找到正確的表達方式?
foldr (\x (a,b) -> (a || x==2, b || x==7)) (False,False) [1..6]
--(True,False)
忽略了一個事實,這可以很容易地使用elem
寫的,我有我可以採用Arrow
語法簡化拉姆達的強烈的感覺,我只是無法得到它的權利。
這個lambda可以用箭頭簡化嗎?你有什麼關於如何「看」箭頭可能工作的一般提示,以及如何找到正確的表達方式?
拉出計算出foldr相似的 -
ghci> :m +Control.Arrow
ghci> any (==2) &&& any (==7) $ [1..6]
(True,False)
但是,如果你想確保你只穿過一次名單,請嘗試使用bifunctor package:
ghci> :m +Data.Bifunctor +Data.Bifunctor.Apply
ghci> foldr (bilift2 (||) (||) . ((==2) &&& (==7))) (False, False) [1..6]
(True,False)
或更短:元素2 &&& elem 7 $ [1..6]' – Landei 2012-03-09 22:58:15
foldr (\x -> (|| x==2) *** (|| x==7)) (False,False) [1..6]
我不認爲你可以用箭頭抽象出x
。
編輯:嗯,好像你可以:
foldr (uncurry (***) . (((||) . (==2)) &&& ((||) . (==7)))) (False,False) [1..6]
愛德華Kmett解放出來我從需要關心箭頭3周股份公司o [在布蘭登西蒙斯的博客上有這些評論](http://brandon.si/code/categories-that-want-to-be-arrows/#comment-437318026)。 – 2012-03-09 19:51:27
@DanielLyons儘管如此,由於箭頭的功能實例,典型的箭頭組合符&&&','|||'和'***'可以是有用的。 – 2012-03-09 22:01:43
同意。我只是不認爲真正的回報,充分理解他們證明了這種痛苦。 – 2012-03-09 23:12:45