gpt4 book ai didi

multithreading - 在函数式编程中如何避免副作用

转载 作者:行者123 更新时间:2023-12-03 13:16:05 25 4
gpt4 key购买 nike

我一直在比较Scala与Java的并发编程优势。

显然,我要讲的第一点是 Scala是一种功能编程语言(部分使用FP)避免了副作用

与命令式语言相比,在函数式编程中如何避免副作用以及如何在多线程/并行编程中起作用?

最佳答案

我认为该声明的意思是,Scala作为一种功能性OO OOt 混合语言鼓励(有时使您)使用功能性构造和规则,这些功能和规则将导致没有副作用。您可以很好地编写具有副作用的非功能性有状态Scala代码;-)另一方面,您可以尝试编写功能性Java(例如),但是由于功能不是一流的对象,因此看起来可能很难看。因此,我不会说这样做自然而然,而是更喜欢以某种方式为您提供帮助,并且总体上鼓励您这样做。

好的,在进行函数式编程时应遵循几个原则,因此不会给您带来任何副作用:

  • 不变的是很好的-首选一旦创建但无法修改的结构。例如,在Java列表中,您可以修改第n个元素,但在Scala中,您将返回带有新元素的该列表的副本。是的,这可能意味着程序中会有更多对象,但也应导致可重用和更安全的代码。
  • 将值作为参数传递,不将状态存储在成员变量中-共享状态是许多问题的原因,管理共享状态是有问题的(例如,您需要使用锁等)。
  • 更喜欢重新计算值如果它很便宜,而不是缓存它们(这是规则的某些异常(exception),例如http://en.wikipedia.org/wiki/Memoization是一种非常常用的技术!)

  • 实际上,遵循上述规则避免副作用的最大好处之一就是更容易进行并发编程!毕竟,并发编程中的最大障碍是管理共享状态!

    既然规则之一就是可变状态和共享状态不好,那么您就不要使用它!取而代之的是,许多功能语言(例如Erlang或Scala)更喜欢所谓的Actor模型,其中Actors(可以与线程进行比较)仅通过彼此发送消息来进行通信(请参阅传递值而不是将它们存储在某个地方!)。

    关于multithreading - 在函数式编程中如何避免副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19354450/

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