有時您想使用不同的摺疊函數將元組列表摺疊到一個元組中。例如,爲了將runState結果列表粘貼在一起,獲得(某種意義上)組合狀態和組合結果。使用箭頭摺疊元組列表
考慮以下實現:
wish :: (a -> a' -> a) -> (b -> b' -> b) -> (a,b) -> [(a', b')] -> (a,b)
wish lfn rfn x xs = foldl (\(a,b) -> (lfn a) *** (rfn b)) x xs
雖然它的作品,我覺得不舒服關於這個拉姆達。 lfn *** rfn
本身有一種(a,b) -> (a -> a', b -> b')
類型,我無法找到一種正確應用於元組而無需訴諸模式匹配的方法。有沒有一種清晰而優雅的方式我錯過了?它可能是(a,a') -> (a -> a, a' -> a') -> (a, a')
類型的庫函數,或者可能是一個完全不同的方法。
某種類型的BiApplicative類可以做。有可能是某個地方有瑕疵,但我會將其留給其他人以涵蓋哪些是好的並且不被棄用。 – Carl
http://squing.blogspot.com/2008/11/beautiful-folding.html及其在Hackage上的實例化,http://hackage.haskell.org/package/ZipFold –