我从Java学习编程,然后每年尝试学习一种编程语言,第二种是C ++,然后是Python。它来学习下一个,我寻找新的东西,我选择Scala,因为它与Java兼容,可能是从OOP到功能编程的一些过渡。
很酷,学习新的范例,新的风格和新的思维方式。阅读有关优雅的Scala概念的精彩体验,以及更好的Scala代码。
阅读我面对的许多文章this批评Scala的文章:
Scala不是一种函数式编程语言。它是一种静态类型的面向对象语言,带有闭包。
阅读完这篇文章之后,我有些疑惑,我真的很喜欢Scala并开始更多地使用Scala编写,但是Scala是否适合函数式编程的定义?那篇文章是说真话还是假装读者?我必须学习Haskell或其他一些功能编程语言来真正体验FP吗?
更新:通过良好的示例期待理性答案,而不会引起争议。
答案 0 :(得分:36)
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 不功能!副作用丰富,可变状态 - 您可以用Scala做的所有事情都可以在Scala中完成。
尽管如此,Scala 允许您以功能样式进行编码,并以多种方式让您的生活更轻松(比使用Java):
这看起来更有用:
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不是一种纯函数式编程语言,因此,它的语法并不总是理想的函数式编程,因为还有其他考虑因素在起作用。它确实具有人们期望从函数式编程语言中获得的所有标准特性。
答案 1 :(得分:20)
我对功能语言的个人试金石是教会数字。
方案示例:
(define (thrice f)
(lambda (x)
(f (f (f x))))))
((thrice 1+) 0)
=> 3
(1+
是一个Scheme函数,它的参数加1。thrice
接受一个函数f并返回一个函数,该函数将f与自身组合三次。所以(thrice 1+)
增加了三个它的论点。)
((thrice (thrice 1+)) 0)
=> 9
(因为(thrice 1+)
是一个增加三个的函数,所以thrice
的函数会增加九个函数。)
我的最爱:
(((thrice thrice) 1+) 0)
=> 27
(推理留给读者练习。最后一个例子是最重要的。)
如果你不能用你的语言写这个例子而没有可怕的扭曲,那么我说它不是一种函数式语言(例如:C / C ++)。
如果您可以用您的语言编写此示例,但看起来非常不自然,那么我说您的语言“支持函数式编程”,但实际上并不是一种函数式语言(例如:Perl)。
如果这个示例完全符合您的语言,并且实际上看起来与您日常使用的方式没有太大差别,那么它就是一种功能性语言。
我不知道斯卡拉。有人想告诉我它适合哪里? : - )
答案 2 :(得分:19)