Scala并不强制要求您使用函数式风格。以下代码是完全有效的Scala示例:
var i = 1
while (i < 10) {
println("I like side effects, this is number "+i)
i += 1
}
case class C(var i: Int, var set: Boolean = false)
def setMe(c: C) = { if (!c.set) { c.set = true; c.i += 1 }; c }
setMe(C(5))
因此,Scala在这个意义上可不是函数式的!它充满了副作用和可变状态——你在Java中能做的所有事情都可以在Scala中做到。
尽管如此,Scala允许你以函数式风格编码,并在许多方面(比Java更)简化了你的生活:
- 有一流函数
- 有不可变集合库
- 支持尾递归(只要JVM能够管理得了)
- 支持模式匹配
- (等等)
这看起来更像是函数式的:
for (i <- 1 to 10) println("Sometimes side effects are a necessary evil; this is number"+i)
case class C(i: Int, set: Boolean = false)
def setIt(c: C, f: Int=>Int) = C(f(c.i), true)
setIt(C(5), _+1)
值得注意的是,那篇特定文章的作者似乎对Scala了解甚少;几乎每个在他手中看起来丑陋的例子都是不必要的。例如,他写道:
def x(a: Int, b: Int) = a + b
def y = Function.curried(x _)(1)
但这不是很糟糕,只要你注意自己在做什么:
def x(a: Int)(b: Int) = a + b
val y = x(1) _
总之,Scala不是一种纯函数式编程语言,因此它的语法并不总是理想的函数式编程,因为还有其他考虑因素。然而,它几乎拥有所有标准的函数式编程语言特性。