Я играю с последовательностями, выровненными по типу, и в частности, я возился с идеей сложить их. Складная последовательность, выровненная по типу, выглядит примерно так:
class FoldableTA fm where
foldMapTA :: Category h =>
(forall b c . a b c -> h b c) ->
fm a b d -> h b d
foldrTA :: (forall b c d . a c d -> h b c -> h b d) ->
h p q -> fm a q r -> h p r
foldlTA :: ...
Довольно легко реализовать foldrTA
в терминах foldMapTA
, сначала используя foldMapTA
для преобразования последовательности в список с выравниванием по типу наивным способом (т. е. используя категорию списка с выравниванием по типу), а затем свернув этот список. К сожалению, это может быть весьма неэффективно, потому что длинные списки могут быть добавлены перед короткими. Я пытался найти способ использовать трюк, подобный тому, что использовался в Data.Foldable
, чтобы более эффективно определять правую и левую складки, но типы вызывают у меня головокружение. Endo
не кажется достаточно общим, чтобы добиться цели, и каждый шаг, который я делаю в других направлениях, приводит меня к большему количеству переменных типа, чем я могу уследить.