【发布时间】:2017-05-23 14:28:44
【问题描述】:
我正在尝试在 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 是一个 Int => Int 函数和一个整数的元组。
y(f,1)你试图在一个元组上调用一个函数。 tuple 上没有定义 apply 函数。 -
那么,这是否意味着我必须遵循原始代码示例方式?在类型中定义应用?或者我可以在 lambda 中如何做到这一点?
-
是的,您的原始代码示例是类型投诉。你应该遵循这种方法。原始代码已经非常优化,让我们知道您正在寻找什么进一步的优化
-
所以,据我所知,我不能在 lambda 表达式中扩展元组?所以这必须单独表达?那没关系
-
更新了我的答案,更正了您的类型记录定义