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

dfe*_*uer 8 haskell typeclass

一个最近的问题使我想知道如何转换

forall f . Functor f => [LensLike f s t a b]
Run Code Online (Sandbox Code Playgroud)

进入

[ReifiedLens s t a b]
Run Code Online (Sandbox Code Playgroud)

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

Ørj*_*sen 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]
Run Code Online (Sandbox Code Playgroud)

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 }
Run Code Online (Sandbox Code Playgroud)

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

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