Scala是一种函数式编程语言吗?[已关闭]

我从Java学习编程,然后尝试每年学习一种编程语言,第二种是C++,然后是Python。它来学习下一个,我寻找新的东西,我选择Scala,因为它与Java兼容,并且可以从OOP到函数式编程的过渡。

这很酷,学习新的范式,新的风格和新的思维方式。阅读优雅的Scala概念是很棒的体验,在Scala上编码要好得多。

读了很多文章,我面对这篇文章批评Scala:

Scala不是一种函数式编程语言。它是一种具有闭包的静态类型面向对象的语言。

读完这篇文章后,我产生了一些疑问,我真的很喜欢Scala,并开始更多地写Scala,但是Scala适合函数式编程的定义吗?那篇文章说的是事实,还是只是在假装读者?我必须学习Haskell或其他一些函数式编程语言才能真正体验FP吗?

更新:期望用好的例子给出理性的答案,而不会引起争议。


答案 1

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))

所以从这个意义上说,恐怖,斯卡拉是没有功能的!副作用丰富,可变状态 - 在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不是一种纯粹的函数式编程语言,因此,它的语法并不总是函数式编程的理想选择,因为还有其他考虑因素在起作用。然而,它确实具有人们期望从函数式编程语言中获得的所有标准功能。


答案 2

Scala是一种多范式编程语言,旨在集成面向对象编程和函数式编程的功能。

我说得再好不过了,除了毫无意义的争论之外,这就是所有要说的。