在scala中定义递归lambda表达式

在scala中定义递归lambda表达式,scala,lambda,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.sca

我试图在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))
任何帮助都将不胜感激

谢谢

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

在您的语句val y:rec=f:Int=>Int,x:Int=>如果x>0 y f,1 else 1,您试图调用元组y yf,1上的apply函数。由于元组没有定义apply函数,因此您得到的错误是rec不接受参数

根据示例代码,输入rec 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

rec是Int=>Int函数和整数的元组。根据yf,1,您试图调用元组上的函数。tuple没有定义apply函数。那么,这是否意味着我必须遵循原始代码示例的方式?要在类型中定义应用程序?或者我可以在lambda中这样做一些方法?是的,您的原始代码示例是类型投诉。你应该遵循这种方法。原来的代码是相当优化让我们知道什么进一步优化你正在寻找,因为我知道我不能扩展lambda表达式内的元组?所以这必须分开表达?没关系,然后更新了我的答案,更正了您的type rec定义。您也可以直接将问题标记为重复。无论如何,谢谢你的提示。@d天哪,他们不能。需要15个信誉点:
var sumIt:(Int => Int) = (x: Int) => {if(x<=1) 1 else sumIt(x-1)+x