镜头似乎没有任何缺点,同时具有优于标准Haskell的显着优势:是否有任何理由我不应该尽可能使用镜头?有性能考虑吗?另外,模板Haskell是否有任何重大开销?
dfl*_*str 25
镜像形成了对数据构造函数使用直接闭包的替代方法.因此,镜头与直接使用函数和数据构造函数具有大致相同的警告.
一些缺点是因为:
每次修改镜头时,都可能会导致(重新)创建大量对象.例如,如果您有此数据结构:
A { B { C { bla = "foo" } } }
...和类型的镜头Lens A String,您将创建一个新的A,B并且C每次"修改"那个镜头.这在Haskell(创建大量对象)中并不罕见,但是对象创建隐藏在镜头后面,因此很难将其视为潜在的性能下沉.
和专业人士:
data-lens-fd示例),这样可以避免由于大量数据共享而在大多数时间内重新创建大量对象.请参阅示例focus函数,以及withSomething在Snap Web框架中使用函数的类似模式.但是,镜头并不总是与数据构造函数的闭包同构.以下是一些差异(data-lens作为此处的实现):
data-lens,这是Storecomonad.这意味着每次创建镜头时,由于创建了数据结构,所以会产生非常小的额外开销.模板Haskell代码在编译时运行,并且不会影响镜头的运行时性能.
小智 7
我假设数据镜头包.对于类似数据的事物(记录,元组,地图等),镜头对我来说表现非常好.实际上,它们有时甚至比正常方法表现更好,可能是因为更好的共享.在性能方面,它产生的性能与您手工编写的代码大致相同.
然而,有类似功能的东西,镜头可能会受到惩罚.例如,我至少记得一次使用像这样的镜头:
result :: (Eq a) => a -> Lens (a -> b) b
虽然查询非常快,但我偶尔会覆盖函数的某些结果值以将其调整为特定的场景,这相当于将函数的主体包含在一个大的中if.当然,性能影响与镜头本身无关,但值得注意.
| 归档时间: | 
 | 
| 查看次数: | 3259 次 | 
| 最近记录: |