镜片(Lenses) 在具有显着优势的同时似乎没有任何缺点,与标准Haskell相比: 我是否应该尽可能使用镜片? 是否有性能考虑?此外,模板Haskell是否有任何显着的开销?
镜片(Lenses) 在具有显着优势的同时似乎没有任何缺点,与标准Haskell相比: 我是否应该尽可能使用镜片? 是否有性能考虑?此外,模板Haskell是否有任何显着的开销?
Every time you modify a lens, you might potentially cause a lot of objects to be (re)created. For example, if you have this data structure:
A { B { C { bla = "foo" } } }
...and the lens of type Lens A String
, you will create a new A
, B
and C
every time you "modify" that lens. This is nothing unusual in Haskell (creating lots of objects), but the object creation is hidden behind the lens, making it hard to spot as a potential performance sink.
以下是优点:
data-lens-fd
的示例),这使得由于大量数据共享而大部分时间都无需重新创建对象成为可能。例如,请查看focus
函数以及在Snap Web框架中使用withSomething
函数的类似模式。但是,镜头并不总是等同于对数据构造函数的闭包。以下是一些差异(以data-lens
作为此处的实现):
data-lens
,它是 Store
comonad。这意味着每次创建镜头时,由于创建了该数据结构,会有非常小的额外开销。模板 Haskell 代码在编译时运行,不会影响镜头的运行时性能。
result :: (Eq a) => a -> Lens (a -> b) b
虽然查询速度非常快,但我偶尔会覆盖函数的某些结果值,以使其适应特定场景,这相当于将函数体包含在一个大的if
中。当然,性能影响与镜头本身无关,但这是值得注意的。