Scala如何适用于大型可扩展应用程序

时间:2014-01-04 02:37:06

标签: scala functional-programming purely-functional

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

我的意思是来自imperative languages我发现StackOverflowGarbage Collection冒险并且正在运行的所有内容的多个副本Out Of Memory

我在这里失踪了什么?

2 个答案:

答案 0 :(得分:3)

  • 堆栈溢出:可以使递归函数尾递归。从@tailrec添加scala.annotation.tailrec以确保您的函数是100%尾递归。这基本上是一个循环。
  • 最重要的递归解决方案只是众多可用模式中的一种。请参阅“有效Java”,为什么可变性很差。不可变数据更适合大型应用程序:不需要同步访问,客户端不能混淆数据内部等。在许多情况下,不可变结构非常有效。如果在列表的头部添加一个元素:elem :: list所有数据都在两个列表之间共享 - 真棒!只创建头并指向列表。想象一下,每次客户端要求时,您都必须创建一个新的列表深度克隆。
  • Scala中的表达式更简洁,可能更懒惰 - 创建过滤器和地图以及根据需要应用的所有内容。你可以在Java中做同样的事情但是仪式需要永远,所以通常devs只是在途中创建多个临时集合。
  • Martin Odersky将可变性定义为对时间/历史的依赖。这非常有趣,因为只要没有其他代码可以以任何方式受到影响,你就可以在函数内使用var,即结果总是相同的。
  • 查看Option[T]并与null进行比较。在for理解中使用它们。异常变得非常特殊,Option, Try, Box, Either以非常好的方式传达失败。
  • 与Java相比,Scala允许更省力地编写更多模块化和通用代码。
  • 找到一个很好的Scala代码并尝试看看如何用Java实现它 - 这将是不言而喻的。

答案 1 :(得分:0)

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

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

看一看 http://pavelfatin.com/scala-for-project-euler/ 这给出了一些使用map fllter等函数的例子。这些函数通常由Ruby应用程序使用

不变性和递归的组合避免了很多堆栈溢出问题。在处理事件驱动的应用程序时,这很容易实现

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