我需要语法方面的帮助。
问题:如何在这种情况下递归调用方法?
请在下面的代码中找到错误:
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:\源头\阶>
答案 0 :(得分:4)
您的功能定义存在很多问题。
由于上下文界限的工作方式,def increase[T: Numeric](x: T) = (y: T) => ???
的行为类似于def increase[T](x: T)(implicit ev: Numeric[T])(y: T)
。隐式参数列表位于正常参数列表之间,因此不可能一个接一个地提供x
和y
。因此,increase(x)(abs(y))
无法工作,您必须使用increase(x).apply(abs(y))
之类的内容。
您不应该使用0.asInstanceOf[T]
。例如,如果T
为BigInt
,则会变为0.asInstanceOf[BigInt]
并导致运行时异常:java.lang.ClassCastException: java.lang.Integer cannot be cast to scala.math.BigInt
。您可以改为使用implicitly[Numeric[T]].zero
。
到处都有implicitly[Numeric[T]]
不是很漂亮。为此隐式参数设置固定名称并导入隐式操作会更好,因此可以使用x > num.zero
和x + y
。请参阅下面的示例。
正如评论中所提到的,您必须明确指定递归函数的返回类型。在您的情况下,它应该是T => T
。
因此,通过所有这些,您可以对增量方法有以下定义:
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
}