【问题标题】:Define recursive lambda expression in scala在scala中定义递归lambda表达式
【发布时间】: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 表达式中扩展元组?所以这必须单独表达?那没关系
  • 更新了我的答案,更正了您的类型记录定义

标签: scala lambda


【解决方案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

根据您的示例代码,您的类型为 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

【讨论】:

    【解决方案2】:

    Check This link for this answer explanation

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

    【讨论】:

    • 您也可以直接将问题标记为重复。无论如何感谢您的提示。
    • @dboy 他们不能。 Flag posts 需要 15 个声望点 :)
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多