【发布时间】:2020-12-22 11:58:26
【问题描述】:
我是 Scala 的新手,我正在学习关于集合的模式匹配,以编写一个简单的逻辑来通用地查找最后一个元素。这是我的第一次尝试:
@scala.concurrent.tailrec
def penultimate[A](elems: List[A]) = elems match {
case Nil => None
case first :: second :: Nil => Some(first)
case head :: tail => penultimate(tail)
}
这够好吗?我读到了尾递归,并把我的方法变成了尾递归!
但是,对于以下情况以及我期望 Some(1) 的情况,它会失败:
penultimate[Int](List(1)) // This should give me Some(1)
还有什么更好的办法吗?我可以使用 Scala 集合库中的 reverse 方法并使其成为单行,但我不想使用它。
有更好的方法吗?
【问题讨论】:
-
你说的不对。首先:您的代码无法编译。第二:修复编译错误时
penultimate(List(1))返回None。 -
很抱歉造成混乱!我已经编辑了我的帖子!
-
现在我很困惑。为什么你会期待
Some(1)? -
如果列表只包含一个元素,我想返回那个元素!这对我来说只是一些实验。当列表中只有一个元素时,这并不是一个硬性规定。我喜欢你的回答非常简洁,但是对于像我这样从 Scala 开始的人来说,理解通配符的用法可能不是那么简单!
标签: scala