さまざまな折りたたみ関数を使用して、タプルのリストを 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')
またはまったく異なるアプローチである可能性があります。