異なる折り畳み関数を使用してタプルのリストを1つのタプルに折りたたみたいことがあります。たとえば、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 –