Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala:递归函数组合_Scala_Function - Fatal编程技术网

scala:递归函数组合

scala:递归函数组合,scala,function,Scala,Function,我试图强调测试scala函数的组合功能。 具体来说,我试图定义递归函数组合。 因此,问题是在当前的实施中是否有可能做到这一点,如果有,我如何做到这一点 以下是我到目前为止的情况: def f(x: Int) = { println("First ..") x + x / 2 } def g(x: Int) = { println("Second ..") x * x } // this will work as expected val z = f _ compose g _

我试图强调测试scala函数的组合功能。 具体来说,我试图定义递归函数组合。 因此,问题是在当前的实施中是否有可能做到这一点,如果有,我如何做到这一点

以下是我到目前为止的情况:

def f(x: Int) = {
  println("First ..")
  x + x / 2
}

def g(x: Int) = {
  println("Second ..")
  x * x
}

// this will work as expected
val z = f _ compose g _ 

// will not compile: error => recursive value r needs type
// val r = f _ compose r _ 

val t = z(5)

print(t)

您希望它编译还是运行

在运行时,如果您尝试应用
r
,将出现
StackOverflowError
(或类似错误)


您希望它编译还是运行

在运行时,如果您尝试应用
r
,将出现
StackOverflowError
(或类似错误)


我希望它运行时不会出现StackOverflow异常,需要设置一些执行限制逻辑。哦。。。我明白了,这只是第二个函数如何停止执行。@Pavel这个“如何”抛出了一个异常,这与函数编程相去甚远(异常是一个副作用)-因此我认为最好以更合适的方式重新实现您的解决方案(即使是必要的)。您在这里的选择:相互递归(带蹦床)、迭代器、streamsQuestion与函数组合特别相关,我对答案很满意。我希望它运行时不会出现StackOverflow异常,需要设置一些执行限制逻辑。哦。。。我明白了,这只是第二个函数如何停止执行。@Pavel这个“如何”抛出了一个异常,这与函数编程相去甚远(异常是一个副作用)-因此我认为最好以更合适的方式重新实现您的解决方案(即使是必要的)。您在这里的选择:相互递归(使用蹦床)、迭代器、streamsQuestion与函数组合特别相关,我对答案很满意。
lazy val r: Int => Int = f _ compose r 

def r(n: Int): Int = f(r(n))