scala - 如何在Scala上执行函数式编程

标签 scala

我开始学习函数式编程,并且希望使用Scala而不是Haskell或Lisp。

但是有些人声称将Scala作为第一门功能语言进行学习会减慢您对函数式编程的学习,因为Scala允许您同时使用两种方法进行编程,并且在遇到棘手的问题时往往会以程序方式进行编程。

我如何确保以纯粹的功能方式进行编程?也许是由于无法正确地区分这两种样式,因此我会不经意地进行程序编程)。

例如,我知道我应该只使用vals而不是vars。

最佳答案

其他答案已经提出了一些好的观点,但是为了尝试快速掌握一些准则,请按以下步骤操作:

首先,要完全避免的一些事情:

  • 不要使用var关键字。
  • 不要使用while关键字。
  • 不要在scala.collection.mutable包中使用任何东西。
  • 不要使用asInstanceOf方法。
  • 不要使用null。如果您遇到过null(使用其他人的代码),请立即将其包装在更合适的数据类型中(通常Option会很好用)。

  • 然后,通常需要避免几件事:
  • 谨慎使用返回类型为Unit的任何东西。返回类型为Unit的函数不执行任何操作,或仅通过副作用进行操作。在某些情况下,您将无法避免这种情况(IO很明显),但是在其他地方看到它则可能是杂质的迹象。
  • 警惕调用Java库-它们通常在设计时就没有考虑功能性编程,因此经常需要您放弃功能性方法。

  • 一旦避免了这些事情,该怎么做才能将代码转变为更具功能性?
  • 在执行直接递归时,寻找机会通过使用高阶组合器将其概括。 fold可能是您最大的候选者-列表上的大多数操作都可以通过适当的fold来实现。
  • 当您看到数据结构上的解构操作(通常通过模式匹配)时,请考虑是否可以将计算提升到结构中并避免对其进行解构。下面的代码段是一个明显的示例:
    foo match {
      case Some(x) => Some(x + 2)
      case None => None
    }
    

    可以替换为:
    foo map ( _ + 2 )
    
  • 关于scala - 如何在Scala上执行函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16418140/

    相关文章:

    scala - 找出隐式调用链

    scala - 如何在Spark Shell中将s3与Apache Spark 2.2一起使用

    excel - 带有空主体的 HTTP GET 响应,在 IE 中下载了 excel 文档

    java - 在 Akka Streams Sink 之后获取原始元素的引用?

    Scala - 在没有 Apache 的情况下转义 Unicode 字符串

    scala - Gatling-scala 检查 2 个状态代码(或)

    scala - 基于顶点 ID 创建边引发 scala

    scala - 如何区分宏中的三引号和单引号?

    使用特定服务 url 的 scala-pact 提供者验证

    Eclipse Scala插件: "illegal cyclic inheritance"