Иногда вы хотите свернуть список кортежей в один кортеж, используя различные функции сгибания. Например, для склеивания списка результатов 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')
или совсем другой подход.