变形光学与镜头有什么关系?

6

镜头(Lens)是记录访问器,例如。

http://hackage.haskell.org/packages/archive/lens/3.9.0.2/doc/html/Control-Lens-Type.html#t:Lens

与变形相关?例如。

http://hackage.haskell.org/packages/archive/recursion-schemes/3.0.0.2/doc/html/Data-Functor-Foldable.html#v:ana

你能将前者变成后者的实例吗?

我最近经常使用镜头。在Haskell编程中,镜头在许多方面都是至关重要的;它们是记录访问、有状态程序的工具...为了更好地理解镜头,我开始阅读《香蕉、镜头、信封和铁丝》论文。在“INSIDE 206-105”的帮助下,我慢慢地在Haskell中重新实现了-morphism。 然后上述问题出现了。


2
只是为了明确起见:论文标题中的“镜头”指的是他们使用的括号,而不是函数镜头。你可能已经知道这一点,但它让我有点困惑 :P。 - Tikhon Jelvis
@TikhonJelvis - 香蕉、透镜等是否都是著名论文中对“squiggol”括号的比喻描述,这些括号在该论文以及之前由Richard Bird使用? - stephen tetley
3
是的,但它们只是两个没有关联的概念,拥有相同的名称,比如MonadMonad - Edward Kmett
1个回答

15

在 Bird 的 SQUIGGOL 形式中的镜头与现代概念中的函数引用镜头之间绝对没有任何联系。

递归方案和函数引用镜头是不相关的概念。

这只是术语上的不幸巧合。不幸的是,通常意味着当人们看到这些名称时,他们会试图回到“源头”,结果变得非常困惑!

如果您想查找有关镜头主题的早期论文,最好去阅读 Benjamin Pierce 关于 Boomerang 的论文。在那里,他定义了几个镜头的概念。与 Haskell 中使用的函数引用形式相对应的是他所称的“非常良好的镜头”。然后,他沿着与我在 lens 包中采取的不同方向进行了概括。他专注于使用它们来恢复不变量,而“非常良好的”镜头则首先不会破坏不变量。

函数引用意义上的“镜头”一词是指它查看整体的一部分。递归方案意义上的“镜头”一词是指 [()] 在语法上看起来有点像凹透镜。

tl;dr它们彼此之间没有任何关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接