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

Scala是函数式编程语言吗? 我从java学习了编程,然后尝试每年学习一种编程语言,第二种是C++,然后是Python。接下来我要学习的是,我寻找一些新的东西,我选择Scala,因为它与Java兼容,可以从OOP过渡到函数式编程,java,python,scala,haskell,functional-programming,Java,Python,Scala,Haskell,Functional Programming,很酷,学习了新的范式、新的风格和新的思维方式。阅读优雅的Scala概念是一种很好的体验,在Scala上编写代码要好得多 读了很多文章,我遇到了一篇批评Scala的文章: Scala不是函数式编程语言。它是一种带有闭包的静态类型的面向对象语言 读了这篇文章后,我产生了一些疑问,我真的很喜欢Scala,并且开始更多地在Scala上写东西,但Scala适合函数式编程的定义吗?那篇文章说的是真话还是假的读者?我必须学习Haskell或其他函数式编程语言才能真正体验FP吗 更新:以好的例子期待理性的答案,

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

读了很多文章,我遇到了一篇批评Scala的文章:

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

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

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


我说得再好不过了,除了那些毫无意义的参数,我只想说这些。

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))
但是,如果你注意你正在做的事情,情况并没有那么糟:

def x(a: Int)(b: Int) = a + b
val y = x(1) _

无论如何,归根结底,Scala不是一种纯粹的函数式编程语言,因此,它的语法对于函数式编程并不总是理想的,因为还有其他需要考虑的因素。然而,它确实具有人们期望从函数式编程语言中获得的所有标准特性。

我个人对函数式语言的试金石测试是教会数字

方案示例:

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

((thrice 1+) 0)
  => 3
1+
是一个向其参数中添加1的Scheme函数。
三次
获取函数f并返回一个与自身组成f的函数三次。因此
(三次1+
向其参数中添加三次。)

(因为
(三次1+
是一个加三的函数,取三次的
得到一个加九的函数。)

我最喜欢的是:

(((thrice thrice) 1+) 0)
  => 27
(推理留给读者作为练习。最后一个例子是最重要的。)

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

如果您可以用自己的语言编写这个示例,但它看起来非常不自然,那么我说您的语言“支持函数式编程”,但实际上不是函数式语言(示例:Perl)

如果这个例子很好地移植到您的语言中,并且实际上看起来与您每天使用它的方式没有太大区别,那么它就是一种函数式语言


我不认识斯卡拉。有人想告诉我它放在哪里吗?:-)

请删除所有与问题无关的个人意见。它浪费了我们本应投资于解决您的问题的宝贵时间。谢谢,我更新了问题。相关:和。“面向对象语言鼓励过度使用状态和继承。”“函数式语言鼓励过度使用高阶编程。”(摘自Peter van Roy och Seif Haridi.版权所有©2004.0-262-22069-5.麻省理工学院出版社.计算机编程的概念、技术和模型。)这个问题是不可能回答的,因为函数式语言没有明确的定义。你当然可以在Scala中以函数式风格编程。这使它具有功能吗?
def三次[a](f:a=>a)=f和第f,第f和第f分别给出3次(三次[Int](1+)(0)////给出9
三次(三次[Int])(1+)(0)//给出27
.Howzat?(FWIW,它看起来不自然,但这是因为创建数字27的方法效率极低,而且应用后续操作“1+”不是我们大多数人认为做算术的方式。(就这一点而言,三次迭代一个函数也不是那么有用,因为有
Iterator.iterate
来应用任意深度的函数。)@Rex:好吧,你也不会像这样在Scheme中加27,但这不是重点。这实际上是Alonzo Church在原始lambda演算中表示自然数的方式。(当你只有
lambda
时,你的选择是有限的。)我称之为“三次”,他称之为“3”;就像实际的整数3一样。在我看来,写一个可以应用于自身的“三次”的能力是对一种语言“功能”的一个很好的测试。@Hyenk:嗯,我想线条噪音看起来是“自然的”对大多数Perl程序员来说:-)@Nemo:情人眼里出西施。我对Scheme也是如此。
三次(\&Thrice)->(\&Inc)->(0)
对我来说似乎比
((三次)1+0)
更容易理解,它所发生的事情更明确。
(define (thrice f)
    (lambda (x)
        (f (f (f x))))))

((thrice 1+) 0)
  => 3
((thrice (thrice 1+)) 0)
  => 9
(((thrice thrice) 1+) 0)
  => 27