【发布时间】:2015-05-10 22:45:00
【问题描述】:
我最近开始学习 scala,作为作业的一部分,我需要编写一个具有以下要求的函数:它必须是递归的,并且在列表为空的情况下抛出异常。试过这段代码,但总是抛出异常。
def max(xs: List[Int]): Int =
if (xs.isEmpty) {
throw new NoSuchElementException("empty list")
} else {
if (xs.head > max(xs.tail)) xs.head else max(xs.tail)
}
}
已编辑:很抱歉出现错误,当然需要使用 new 创建异常。但是,该函数总是失败并出现异常。 试过 require(),但它返回一个 Unit 类型,因此编译器说它不能放在那里。 有没有一种简单的方法可以从 scala 中的递归函数中抛出异常而不解析为 Try、Option 和其他?
【问题讨论】:
-
你必须创建一个新的异常来抛出:
throw new NoSuchElementException。该问题与递归或Int无关。 -
Psst,你的递归总是以空的情况结束。可能想对此做点什么,因为大概你不总是想抛出异常。
-
或者你可以看看
scala.util.Try -
您可以插入 require(xs.length > 0, "empty list) 作为函数定义的第一行。这将引发 java.lang.IllegalArgumentException 并显示消息“requirement failed: empty array” .
-
尝试对列表元素的各种排列使用模式匹配,它应该使您的基本情况更清晰。要构建递归列表操作,请从可能的最小输入开始,并在添加元素时考虑它的行为。