Новое в Scala и функциональном программировании в целом.Получите следующий фрагмент кода, который означает вычисление суммы за закрытый интервал Int
с.Реализован как хвостовой рекурсивный метод (sum1
), так и не хвостовой рекурсивный метод (sum2
).
package test
import scala.annotation.tailrec
object Currying extends App{
def sum1(f:Int=>Int)(a:Int, b:Int): (Int, Int) => Int = {
require(a <= b, "Received a=" + a + " and b=" + b)
@tailrec
def sum(a:Int, acc:Int) : Int = {
if(a > b) acc
else sum(a+1, acc + f(a))
}
sum
}
println("sum1(x=>x*x)(1, 4)=" + sum1(x=>x*x)(1, 4))
println("sum1(x=>x*x*x)(1, 4)=" + sum1(x=>x*x*x)(1, 4))
def sum2(f:Int=>Int)(a:Int, b:Int): Int => Int = {
def sum(a:Int) : Int = {
if(a > b) 0
else f(a) + sum(a+1)
}
sum
}
println("sum2(x=>x*x)(1, 4)=" + sum2(x=>x*x)(1, 4))
println("sum2(x=>x*x*x)(1, 4)=" + sum2(x=>x*x*x)(1, 4))
}
Однако распечатки возвращают , а не фактические Int
с, но то, что кажется самой функцией:
sum(x=>x*x)(1, 4)=week2.Currying$$$Lambda$12/1468177767@3d24753a
sum(x=>x*x*x)(1, 4)=week2.Currying$$$Lambda$12/1468177767@67b64c45
sum2(x=>x*x)(1, 4)=week2.Currying$$$Lambda$15/1626877848@2f7a2457
sum2(x=>x*x*x)(1, 4)=week2.Currying$$$Lambda$15/1626877848@6108b2d7
Process finished with exit code 0
Я явно делаю что-то тупое в карри, но я не могу понять, насколько я понимаю.