返回函数的函数的递归调用

时间:2016-04-05 11:10:49

标签: scala function

我需要语法方面的帮助。

问题:如何在这种情况下递归调用方法?

请在下面的代码中找到错误:

HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(InputStream);

FileOutputStream fileOut = new FileOutputStream("/outputfilepath.xls");
embeddedWorkbook.write(fileOut);
fileOut.close();

这是错误代码: c:\ Sources> cd scala

c:\ Sources \ scala> scala main.scala c:\ Sources \ scala \ main.scala:29:错误:递归方法增加需要结果ty PE                         increaseT(隐式[Numeric [T]]。abs(y))                         ^ 找到一个错误

C:\源头\阶>

1 个答案:

答案 0 :(得分:4)

您的功能定义存在很多问题。

  1. 由于上下文界限的工作方式,def increase[T: Numeric](x: T) = (y: T) => ???的行为类似于def increase[T](x: T)(implicit ev: Numeric[T])(y: T)。隐式参数列表位于正常参数列表之间,因此不可能一个接一个地提供xy。因此,increase(x)(abs(y))无法工作,您必须使用increase(x).apply(abs(y))之类的内容。

  2. 您不应该使用0.asInstanceOf[T]。例如,如果TBigInt,则会变为0.asInstanceOf[BigInt]并导致运行时异常:java.lang.ClassCastException: java.lang.Integer cannot be cast to scala.math.BigInt。您可以改为使用implicitly[Numeric[T]].zero

  3. 到处都有implicitly[Numeric[T]]不是很漂亮。为此隐式参数设置固定名称并导入隐式操作会更好,因此可以使用x > num.zerox + y。请参阅下面的示例。

  4. 正如评论中所提到的,您必须明确指定递归函数的返回类型。在您的情况下,它应该是T => T

  5. 因此,通过所有这些,您可以对增量方法有以下定义:

    def increase[T](x: T)(implicit num: Numeric[T]): T => T = (y: T) => {
      import num._
    
      require(x > num.zero)
      if (y > num.zero) x + y
      else increase(x).apply(y.abs)
    }
    
    val inc =  increase[Int] _
    
    println(inc(5)(-1))
    

    此外,您可以在不使用匿名函数的情况下使用类似的定义:

    def increase[T](x: T)(y: T)(implicit num: Numeric[T]): T = {
      import num._
    
      require(x > num.zero)
      if (y > num.zero) x + y
      else increase(x)(y.abs)
    }
    

    以防万一,在这里你甚至不必让它递归:

    def increase[T](x: T)(y: T)(implicit num: Numeric[T]): T = {
      import num._
    
      require(x > num.zero)
      x + y.abs
    }
    
相关问题