在scala中定义递归lambda表达式

时间:2017-05-23 14:28:45

标签: scala lambda

我试图在scala中定义一个递归的lambda表达式,并且如果认为这只是一个语法,那么与sintax有点挣扎: 这是我到目前为止(不可编译):

type rec = (Int => Int, Int)
val f = (x : Int) => x + x
val y : rec = (f:Int => Int, x:Int) => if (x > 0) y( f, 1) else 1

Error I am getting: 
ScalaFiddle.scala:14: error: ScalaFiddle.rec does not take parameters
  val y : rec = (f:Int => Int, x:Int) => if (x > 0) y( f, 1) else 1
                                                 ^

我正在尝试优化的原始代码示例(工作正常):

case class Rec[I, O](fn : (I => O, I) => O) extends (I => O) {
  def apply(v : I) = fn(this, v)
}

val sum = Rec[Int, Int]((f, v) => if (v == 0) 0 else v + f(v - 1))

任何帮助都将不胜感激。

由于

2 个答案:

答案 0 :(得分:1)

rec是Tuple2[Int => Int,Int]类型的元组。

在您的语句val y : rec = (f:Int => Int, x:Int) => if (x > 0) y( f, 1) else 1中,您尝试在元组y(y(f,1))上调用apply函数。由于元组没有定义应用函数,因此您收到错误rec does not take parameters

根据您的示例代码,您的类型为(Int => Int, Int) => Int

因此代码示例将是

type rec = (Int => Int, Int) => Int
val f = (x : Int) => x + x
val y : rec = (f:Int => Int, x:Int) => if (x > 0) y( f, 1) else 1

答案 1 :(得分:0)

Check This link for this answer explanation

var sumIt:(Int => Int) = (x: Int) => {if(x<=1) 1 else sumIt(x-1)+x