Scala是一种函数式编程语言吗?

Rin*_*nov 19 python java haskell functional-programming scala

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

这很酷,学习新的范例,新的风格和新的思维方式.阅读有关优雅Scala概念的精彩体验,以及在Scala上编写代码要好得多.

阅读很多文章我在这篇文章中批评Scala:

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

看完这篇文章之后,我有些疑惑,我真的很喜欢Scala并开始更多地编写Scala,但是Scala是否适合函数式编程的定义?那篇文章是说真话还是假装读者?我必须学习Haskell或其他一些功能编程语言来真正体验FP吗?

更新:通过良好的例子期待理性答案,而不会引起争议.

Rex*_*err 37

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))
Run Code Online (Sandbox Code Playgroud)

所以在这个意义上说,恐怖,Scala是没有的功能!副作用很多,可变状态 - 你可以用Scala做的所有事情都可以在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)
Run Code Online (Sandbox Code Playgroud)

值得注意的是,该特定文章的作者似乎对Scala的理解很差; 几乎每个看起来丑陋的例子都是不必要的丑陋.例如,他写道

def x(a: Int, b: Int) = a + b
def y = Function.curried(x _)(1)
Run Code Online (Sandbox Code Playgroud)

但是,如果你注意你正在做的事情,那就不是那么糟糕了:

def x(a: Int)(b: Int) = a + b
val y = x(1) _
Run Code Online (Sandbox Code Playgroud)

无论如何,底线是Scala不是纯函数式编程语言,因此,它的语法并不总是理想的函数式编程,因为还有其他考虑因素在起作用.然而,它确实具有人们期望从函数式编程语言中获得的所有标准特性.


Nem*_*emo 20

我对功能语言的个人试金石是教会数字.

方案示例:

(define (thrice f)
    (lambda (x)
        (f (f (f x))))))

((thrice 1+) 0)
  => 3
Run Code Online (Sandbox Code Playgroud)

(1+是一个Scheme函数,它的参数加1. thrice取一个函数f并返回一个函数,用它自己组合f三次.所以(thrice 1+)在它的参数上加三.)

((thrice (thrice 1+)) 0)
  => 9
Run Code Online (Sandbox Code Playgroud)

(因为(thrice 1+)是一个增加三个thrice的函数,所以它会增加九个函数.)

而我最喜欢的:

(((thrice thrice) 1+) 0)
  => 27
Run Code Online (Sandbox Code Playgroud)

(推理留给读者练习.最后一个例子是最重要的.)

如果你不能用你的语言写这个例子而没有可怕的扭曲,那么我说它不是一种函数式语言(例如:C/C++).

如果您可以用您的语言编写此示例,但看起来非常不自然,那么我说您的语言"支持函数式编程"但不是真正的函数式语言(例如:Perl).

如果这个示例完全符合您的语言,并且实际上看起来与您日常使用的方式没有太大不同,那么它就是一种功能语言.

我不知道斯卡拉.有人想告诉我它适合哪里?:-)

  • `def三次[A](f:A => A)= f然后f和然后f``triice [Int](1 +)(0)//给出3``三次(三次[Int](1+)) (0)//给出9``三次(三次[Int])(1 +)(0)//给出27`.Howzat? (9认同)
  • (FWIW,它看起来不自然,但那是因为它是一种非常低效的方式来创建数字27,并且因为应用后继操作"1+"并不是我们大多数人想到做算术的方式.(就此而言,也不是thricing一个有用的函数,因为`Iterator.iterate`可以任意深入地应用函数.) (2认同)

Kim*_*bel 19

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

我不能说它更好,除了毫无意义的争论之外,所有这些都可以说.