Scala是函数式编程语言吗?

2024-05-21 00:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

它很酷,学习新的范式、新的风格和新的思维方式。读到优雅的Scala概念是一次很好的体验,在Scala上编写代码会更好。

我读了很多批评Scala的文章this

Scala is not a functional programming language. It is a statically typed object oriented language with closures.

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

更新:希望得到有好例子的合理答案,而不会引起争议。


Tags: 函数is风格编程方式javalanguage编程语言
3条回答

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

方案示例:

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

如果这个例子很好地移植到你的语言中,并且看起来与你日常使用它的方式没有太大的不同,那么它就是一种函数式语言。

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

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不是一种纯函数式编程语言,因此,它的语法并不总是函数式编程的理想选择,因为还有其他的考虑因素在起作用。然而,它实际上拥有函数式编程语言所期望的所有标准特性。

相关问题 更多 >