如何将多态性推入数据结构?

时间:2015-10-12 21:23:10

标签: haskell typeclass

recent question让我想知道如何转换

forall f . Functor f => [LensLike f s t a b]

进入

[ReifiedLens s t a b]

通过使用!!索引到列表中,有一种简单的方法可以非常缓慢地完成它,但它的效率非常低。感觉应该有足够的参数来提取类似于reflection中使用的技巧,但我似乎无法解决任何问题。是否有可能有效地完成这项工作?

1 个答案:

答案 0 :(得分:5)

在评论中测试我的想法,你实际上可以通过ALens直接写这个:

convert :: (forall f. Functor f => [LensLike f s t a b]) -> [ReifiedLens s t a b]
convert ls = [Lens (cloneLens l) | l <- ls]

ALens基于Pretext仿函数:

type ALens s t a b = LensLike (Pretext (->) a b) s t a b

newtype Pretext p a b t = Pretext { runPretext :: forall f. Functor f => p a (f b) -> f t }

这允许使用单个Functor来表示所有这些,至少对于镜头使用而言。

我仍然想知道是否有一种普遍适用的方法,而不仅仅是镜片。