一个最近的问题使我想知道如何转换
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
,但我似乎无法弄明白.是否有可能有效地完成这项工作?
在评论中测试我的想法,你实际上可以通过以下方式直接写出来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
表示所有这些,至少对于镜头使用.
我仍然想知道是否有一种普遍适用的方法,而不仅仅是镜片.