【问题标题】:How side effects are avoided in functional programming在函数式编程中如何避免副作用
【发布时间】:2013-10-21 16:15:03
【问题描述】:

我一直在比较 Scala 在并发编程方面相对于 Java 的优势。

显然我首先想到的是 Scala 是一种函数式编程语言(部分)使用 FP 可以自然地避免副作用

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

【问题讨论】:

  • “Scala 是一种函数式编程语言,可以自然地避免副作用”这是不正确的。 Scala 在功能上不是纯语言,它不会避免副作用。它为您提供了比 Java 更多的控制状态和程序流的方法,是的,但它并不限制您编写有副作用的代码。
  • @VladimirMatveev 已编辑
  • 话虽如此,scala has a plugin 允许您在编译期间检查副作用,并在预期为纯的片段中编译失败。

标签: multithreading scala functional-programming concurrent-programming


【解决方案1】:

我认为,这句话的意思是,Scala 作为一种函数式 OO 混合 语言 鼓励(有时还允许)您使用函数式构造和规则,它们将导致没有副作用。您可以很好地编写具有副作用的非功能性有状态 Scala 代码;-) 另一方面,您可以尝试编写功能性 Java(例如),但由于函数不是第一类对象,因此它可能看起来很难看。所以我不会说它这样做很自然,但更像是在某些方面帮助你,并且总体上鼓励你这样做。

在进行函数式编程时,您应该坚持几个原则,从而不会产生副作用:

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

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

由于其中一条规则是可变和共享状态是不好的,因此您不要使用它!相反,许多函数式语言(例如 Erlang 或 Scala)更喜欢所谓的 Actor 模型,其中 Actor(您可以将其与线程进行比较)仅通过相互发送消息进行通信(参见?传递值而不是将它们存储在某个地方!)。

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2021-07-30
    • 2021-11-16
    • 2021-01-11
    • 1970-01-01
    • 2021-07-09
    相关资源
    最近更新 更多