Gram w pobliżu z type-aligned sequences, a zwłaszcza mam problem z ich złożeniem. Składany sekwencją typu wyrównany wygląda mniej więcej tak:Jak mogę wyrazić foldr w kategoriach foldMap dla sekwencji wyrównanych do typu?
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 :: ...
Jest to dość łatwe do wdrożenia foldrTA
pod względem foldMapTA
najpierw za pomocą foldMapTA
przekonwertować sekwencję na liście typów wyrównany w naiwny sposób (czyli, używając kategorią list wyrównanych do typu), a następnie składaną na tej liście. Niestety może to być dość nieefektywne, ponieważ długie listy mogą być poprzedzone krótkimi. Próbowałem znaleźć sposób na użycie sztuczki podobnej do tej użytej w Data.Foldable
, aby efektywniej zdefiniować prawą i lewą fałdę, ale typy powodują, że mam zawroty głowy. Endo
nie wydaje się być na tyle ogólny, aby zrobić lewę, a każdy krok, który podejmuję w innych kierunkach, prowadzi mnie do większej liczby zmiennych, niż mogę śledzić.
Rzeczywiście, jestem prawie pewien, że wszystko, co się kończy i ma właściwy typ, jest gwarantowane przez parametryczność, aby było poprawne. Wielkie dzięki! – dfeuer