recent question让我想知道如何转换
forall f . Functor f => [LensLike f s t a b]
进入
[ReifiedLens s t a b]
通过使用!!
索引到列表中,有一种简单的方法可以非常缓慢地完成它,但它的效率非常低。感觉应该有足够的参数来提取类似于reflection
中使用的技巧,但我似乎无法解决任何问题。是否有可能有效地完成这项工作?
答案 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
来表示所有这些,至少对于镜头使用而言。
我仍然想知道是否有一种普遍适用的方法,而不仅仅是镜片。