Lenses似乎没有任何缺点,同时比标准 Haskell 具有显着优势:有什么理由我不应该尽可能使用镜头吗? 是否有性能考虑?此外,模板 Haskell 是否有任何重大开销?
最佳答案
镜头形成了在数据构造函数上使用直接闭包的替代方案。因此,镜头与直接使用函数和数据构造函数具有大致相同的注意事项。
由于这个原因的一些缺点:
A { B { C { bla = "foo" } } }
...以及
Lens A String
类型的镜头,您将创建一个新的 A
, B
和 C
每次你“修改”那个镜头。这在 Haskell 中并不少见(创建大量对象),但对象创建隐藏在镜头后面,因此很难将其视为潜在的性能接收器。 和优点:
data-lens-fd
示例),由于广泛的数据共享,这可以避免在大多数情况下重新创建大量对象。例如,参见 focus
函数,以及使用 withSomething
的类似模式Snap Web 框架中的函数。 然而,镜头并不总是与数据构造函数上的闭包同构。以下是一些不同之处(此处以
data-lens
作为实现):data-lens
,它是 Store
comonad .这意味着每次创建镜头时,都会因为创建数据结构而产生非常小的额外开销。 模板 Haskell 代码在编译时运行,并且不会影响镜头的运行时性能。
关于haskell - 使用镜片有什么好处和坏处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10774614/