我在玩类型对齐的序列,特别是我在弄乱折叠它们的想法。一个可折叠的类型对齐序列看起来像这样:
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
似乎不够通用,无法做到这一点,而且我在其他方向上采取的每一步都会导致我获得更多的类型变量,而我无法跟踪。