gpt4 book ai didi

haskell - 对调用者来说看起来很纯粹但内部使用突变的函数

转载 作者:行者123 更新时间:2023-12-04 04:47:28 25 4
gpt4 key购买 nike

我刚拿到我的 Expert F# 2.0 副本,看到了这个声明,这让我有些惊讶:

For example, when necessary, you can use side effects on private data structures allocated at the start of an algorithm and then discard these data structures before returning a result; the overall result is then effectively a side-effect-free function. One example of separation from the F# library is the library's implementation of List.map, which uses mutation internally; the writes occur on an internal, separated data structure that no other code can access.



现在,显然这种方法的优势在于性能。我只是好奇是否有任何缺点——副作用可能带来的任何陷阱是否适用于这里?并行性是否受到影响?

换句话说,如果抛开性能问题,是否最好实现 List.map以纯粹的方式?

(显然这特别涉及 F#,但我也对一般哲学感到好奇)

最佳答案

我认为副作用的几乎所有缺点都与“与程序其他部分的交互”有关。副作用本身还不错(正如@Gabe 所说,即使是纯功能程序也会不断改变 RAM),它是导致问题(调试/性能/可理解性)的效果​​(非本地交互)的共同副作用/ETC。)。所以对纯局部状态的影响(例如对不逃逸的局部变量)是好的。

(我能想到的唯一弊端是,当人类看到这样的局部可变对象时,他们必须推理它是否可以逃脱。在 F# 中,局部可变对象永远无法逃脱(闭包无法捕获可变对象),所以唯一的潜力“心理税”来自对可变引用类型的推理。)

总结:使用效果是可以的,只要简单地说服自己,效果只发生在非逃逸的本地人身上。 (在其他情况下使用效果也可以,但我忽略了其他情况,因为在这个问题线程上,我们是开明的函数式程序员,只要合理,就会试图避开效果。:))

(如果您想深入了解,局部效果,例如 F# 的 List.map 实现中的效果,不仅不会妨碍并行化,而且实际上是一种好处,从更有效的实现分配的角度来看较少,因此对 GC 的共享资源的压力较小。)

关于haskell - 对调用者来说看起来很纯粹但内部使用突变的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com