Я играю с type-aligned sequences, и, в частности, я возился с идеей складывания их. Складная последовательность типа выровнено выглядит примерно так:Как я могу выразить foldr в терминах foldMap для последовательностей, выровненных по типу?
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
не кажется достаточно общим, чтобы сделать трюк, и каждый шаг, который я предпринимаю в других направлениях, приводит меня к большему количеству переменных типа, которые я могу отслеживать.
Действительно, я уверен, что все, что заканчивается и имеет правильный тип, гарантируется параметрической корректностью. Большое спасибо! – dfeuer