Dan*_*iel 3 functional-programming scala
我对透镜的基本理解是,“透镜是表示复杂类型与其组成部分之一之间的映射的值。该映射以两种方式工作\xe2\x80\x94我们可以获取或“访问”组成部分并设置或“变异” “ 它”
\n\n我在设计机器学习库(神经网络)时遇到了这一点,它需要保留一个大的参数数据结构,其中的参数组需要在算法的不同阶段进行更新。我想创建整个参数数据结构不可变,但是更改一组参数需要复制所有参数,并重新创建一个新的数据结构,这听起来效率很低。毫不奇怪其他人 认为。有些人建议使用镜头,从某种意义上说,它可以让您修改不可变的数据结构。而其他一些人建议只使用可变的这些。不幸的是,我找不到任何关于比较这两种范式的内容,包括速度、空间、代码复杂性等。
\n\n现在的问题是,使用透镜与可变设计的优点/缺点是什么?
\n两者之间的权衡几乎如您所猜测的那样。镜头比手动跟踪大型不可变数据结构的更改要简单,但仍然需要比可变数据结构更复杂的代码,并且存在一定的运行时开销。要知道多少,您必须测量,但它可能比您想象的要少,因为许多更新的结构不是复制的而是共享的。
可变数据结构更简单,修改起来也更快,但更难推理,因为现在您必须考虑调用函数的顺序,担心并发性等等。
第三个选择是制作一堆小型的不可变数据结构,而不是一个大的数据结构。由于需要单一的事实来源,并且为了确保对数据的所有引用同时发生变化,可变性通常迫使使用单一的大型数据结构。有了不变性,这就更容易控制。
例如,您可以拥有两个Maps具有相同类型的键和不同类型的简单值的单独的值,而不是Map具有更复杂值的一个。这不仅具有性能优势,还使代码模块化变得更加容易。