【发布时间】:2017-06-06 10:21:34
【问题描述】:
我正在阅读有关 Diode 的信息,这让我想到了 Monocle / Scalaz 中的镜头:
如果我(有条件地)使用Monocle/Scalaz 镜头对深度嵌套数据结构的某些部分进行深度修改,并且想要比较是否有变化,是否需要进行深度比较,或者有没有办法使用引用相等来查看两个数据结构(有条件修改之前和之后)是否相同?
换句话说:
val f_new=modifyWithMonocleIfTheSunIsUp(f_old)
在数据结构的根 (f_old, f_new) 使用引用相等 (eq) 可以提高比较 f_new==f_old 的效率吗?
换句话说,
f_new==f_old 是否为真当且仅当f_new.eq(f_old) 为真? (Equation 1)
如果不是,为什么不呢?
如果没有,是否可以使 Equation 1 为 true ?怎么样?
【问题讨论】:
-
就我极其有限的经验而言:如果您关心表演,请完全避免使用镜头。他们让你慢了很多。无论如何你提出的观点很有趣,等待答案。
-
有什么选择?替代方案更好吗?
-
我仍然没有很好的答案,但认为镜头只是一种语法糖的形式,开销很小,这是一种错误的信念,人们会被它的销售方式所引导。如果你需要处理大量的类和数据结构,那就太好了,但对于性能来说,它就不好了。但是,如果你不能利用并行性,那么整个不可变的方法是不利的。我对替代品很感兴趣,因为我可能处于与您类似的场景中,我想知道您的问题的答案以获取灵感并学习更有效地使用镜头或处理嵌套 DS
-
我不认为 Haskell 中的镜头,例如,从性能的角度来看是不好的,实际上它们比替代品(手动模式匹配)更好。这解释了为什么:skillsmatter.com/skillscasts/…,所以 Scala 中的镜头可能也是如此,我认为它们并不比替代方案(即使用复制)差。
-
顺便说一句,这是镜头的另一种替代品:stackoverflow.com/questions/41201045/…,使用 REF。
标签: scala scalaz lenses monocle-scala