0

我正在学习Functional Programming Principles in Scala | Coursera Scala 课程。我无法理解immutability,so many functionsso much dependencies on recursion, 如何Scala真正适合现实世界的应用程序。

我的意思是来自imperative languages我看到风险StackOverflowGarbage Collection踢我正在运行的所有内容的多个副本Out Of Memory

我在这里缺少什么?

4

2 回答 2

3
  • 堆栈溢出:可以使您的递归函数尾递归。添加@tailrecfromscala.annotation.tailrec以确保您的函数是 100% 尾递归的。这基本上是一个循环。
  • 最重要的是,递归解决方案只是众多可用模式中的一种。请参阅“Effective Java”为什么可变性不好。不可变数据更适合大型应用程序:无需同步访问,客户端不能乱搞数据内部等等。不可变结构在许多情况下非常有效。如果您将一个元素添加到列表的头部:elem :: list所有数据都在 2 个列表之间共享 - 太棒了!只有 head 被创建并指向列表。想象一下,每次客户请求时,您都必须创建一个新的列表深度克隆。
  • Scala 中的表达式更简洁,可能更懒惰 - 创建过滤器和映射以及所有根据需要应用的内容。你可以在 Java 中做同样的事情,但是仪式需要很长时间,所以通常开发人员只是在途中创建多个临时集合。
  • Martin Odersky 将可变性定义为对时间/历史的依赖。这很有趣,因为您可以var在函数内部使用,只要不会以任何方式影响其他代码,即结果总是相同的。
  • 查看Option[T]并比较nullfor在理解中使用它们。异常变得非常异常,并Option, Try, Box, Either以非常好的方式传达故障。
  • 与 Java 相比,Scala 允许以更少的努力编写更多的模块化和通用代码。
  • 找到一段好的 Scala 代码并尝试看看你会如何在 Java 中做到这一点——这将是不言而喻的。
于 2014-01-04T05:03:01.510 回答
0

现实世界的应用程序越来越受事件驱动,这涉及在需要不可变数据结构的不同进程或系统之间传递数据

在大多数情况下,我们要么在操作数据,要么在等待资源。在这种情况下,它很容易与 Actors 挂钩

看看 http://pavelfatin.com/scala-for-project-euler/ 它为您提供了一些使用 map fllter 等函数的示例。Ruby 应用程序经常使用这些函数

不变性和递归的结合避免了很多堆栈溢出问题。这在处理事件驱动的应用程序时派上用场

akka.io 是一个可以在 scala 中非常简洁地构建的经典示例。

于 2014-01-04T05:32:40.333 回答