我目前正在学习 Martin Odersky 的 Coursera 课程的视频讲座,Scala 中的函数式编程原理。在第 2.1 课中,他演示了使用基函数sum()
. 他实现了没有尾递归的阶乘,但我尝试了尾递归,因为它仍然只是一行代码。结果,我得到了类型不匹配,我认为 Odersky 没有。在定义sum()
中,参数f
接受一个Int
并返回一个Int
。我知道我可以通过调整我的函数*来解决这个问题,但这让我想知道如何设计高阶函数。 有没有办法可以调整或规避这种类型定义,以允许函数采用灵活数量的参数? 曾经有人给我看了一点 Haskell,我想知道 Scala 的函数参数是否可以以类似的松散方式键入……或者也许有一个更适合 Scala 的不同解决方案。请假设我昨天刚开始使用 Scala,并且在您的解释中计算机科学知识有限,因为情况确实如此。
def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a+1, b)
//Factorial with tail recursion. The one in the lesson DOES NOT use tail recursion.
//prev is an accumulator.
def fact(a: Int, prev:Int = 1): Int =
if (a == 0) prev else fact(a-1, a * prev)
def sumFactorials(a: Int, b: Int): Int = sum(fact, a, b)
*我知道我可以通过将我的 current 嵌套fact()
在另一个函数中来解决这个问题,如下所示:
def factorial(a: Int): Int ={
def fact(n: Int, prev:Int = 1): Int =
if (n == 0) prev else fact(n-1, n * prev)
fact(a)
}
我从前面提到的 Haskell 经验中得到的印象是,函数式编程促进了只需要一个参数的函数来允许柯里化。无论如何,这与实际问题有点相切,但如果我只是以我的问题的精神可怕地屠杀 FP,请随时在评论中解决这个问题。