Scala:Lensing与可变设计

时间:2017-02-08 18:49:24

标签: scala functional-programming

我对透镜is that的基本理解,“透镜是表示复杂类型与其中一个成分之间的映射的值。此映射有两种方式 - 我们可以获取或”访问“成分和设置或“改变”它“

当我设计一个机器学习库(神经网络)时,我遇到了这个问题,这需要保留一个大的参数数据结构,其中一组需要在算法的不同阶段进行更新。我想创建整个参数数据结构不可变,但更改一组参数需要复制所有参数,并重新创建一个新的数据结构,这听起来效率低下。毫不奇怪other people have thought也是如此。有些人建议使用镜头,在某种意义上,它允许您修改不可变数据结构。虽然其他一些人建议只使用mutables。不幸的是,我无法找到任何关于比较这两种范式,速度方面,空间方面,代码复杂性等方面的内容。

现在的问题是,使用镜头与可变设计的优点/缺点是什么?

1 个答案:

答案 0 :(得分:4)

两者之间的权衡几乎与你猜测的一样。镜头不如手动跟踪对大型不可变数据结构的更改那么复杂,但仍然需要比可变数据结构更复杂的代码,并且存在一定量的运行时开销。要知道多少,你需要测量,但它可能比你想象的要少,因为很多更新的结构没有复制,但共享

可变数据结构更简单,修改起来更快,但更难以推理,因为现在你必须考虑调用顺序函数,担心并发等等。

你的第三个选择是制作一堆小的不可变数据结构,而不是一个大的。可变性通常会强制单个大型数据结构,因为需要单一的事实来源,并确保所有对数据的引用同时发生变化。凭借不变性,这更易于控制。

例如,您可以使用两个单独的Maps来使用相同类型的键和不同类型的简单值,而不是一个具有更复杂值的Map。这不仅具有性能优势,而且还使模块化代码变得更加容易。