【问题标题】:Where should one draw the line between functional programming and imperative programming in a hybrid language like Scala? [closed]在 Scala 这样的混合语言中,应该在哪里划清函数式编程和命令式编程的界限? [关闭]
【发布时间】:2017-03-24 09:33:54
【问题描述】:

函数式程序员经常看不起命令式编程中使用的约定和方法,例如可变变量的使用、for 循环的使用、显式异常的创建。

但是,如果深入研究 Scala 的库,就会发现该语言的优雅功能实际上是由半命令式实现封装的。

例如,考虑在 TraversableLike 特征中实现forall

def forall(p: A => Boolean): Boolean = {
    var result = true
    breakable {
      for (x <- this)
        if (!p(x)) { result = false; break }
    }
    result
}

很容易争辩说,所有函数式语言都是高级语言,并且实际上是建立在命令式基础上的,就像语言本身是使用命令式语言构建的一样。

但是,我的问题是,为了使代码库符合功能标准,应该在命令式和函数式样式之间画什么?

【问题讨论】:

  • 你可以在任何你想要或需要的地方画线。
  • 这将基于意见关闭,但事实上,快速跳出循环通常更容易以命令式风格实现。 FP、OOP、命令式……的混合是 Scala 的复杂之美

标签: scala functional-programming


【解决方案1】:

这主要是一个自以为是的问题,所以我会给出一个自以为是的答案。

Scala 是一种允许命令式/OOP 程序员,尤其是 Java 程序员发现函数式编程的语言。因此,它允许编码人员像在 Java 中那样做所有事情,但也让他们有可能(并且社区鼓励他们)进行函数式编程。

一旦您开始使用 Scala 作为函数式编程语言,您几乎应该永远不要使用命令式元素,例如 vars、returnwhile 循环。

您的大部分编程都应该以函数式的方式完成,以发挥这种范式的所有优势(这不是问题的主题,所以我不会详述这个问题)。

但是,您不能忘记这样一个事实,即在内心深处,运行代码的计算机或 JVM 从根本上来说是必不可少的,因为您发出的指令会改变内存的状态(您无法做到功能更差!)。

因此,出于性能原因,有时使用命令式元素会更好,但这应该尽可能以最受控制和最封装的方式来完成。标准 scala 库尤其如此,但在需要时也可以在任何开发人员代码的某些部分中使用。

一个很好的例子是在 akka Actor 中使用 var。由于 Actor 应该是并发计算的单个单元,它们可以具有内在的可变状态,这将被 Actor 系统的原理所封装(它声明您只能通过消息与 Actor 对话),所以这种状态不会有并发访问/变异的风险(我认为这是可变值的主要问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 2013-07-23
    • 1970-01-01
    • 2010-12-06
    • 2010-11-06
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多