检查列表中的偶数,并在 Scala 中获得类型不匹配 [重复]
Posted
技术标签:
【中文标题】检查列表中的偶数,并在 Scala 中获得类型不匹配 [重复]【英文标题】:Checking for evens on a list, and getting a type mismatch in Scala [duplicate] 【发布时间】:2020-02-11 16:28:19 【问题描述】:我正在尝试检查列表的内容以查看元素是否为偶数。代码如下:
def listEvenChecker2(aList: List[Int]): Boolean =
for (elem <- aList)
if (elem % 2 == 0)
return true
else
return false
val myList = List(1,2,3,4,5,6,7)
println(listEvenChecker2(myList))
为什么会出现这个错误:
【问题讨论】:
myList.forall(_ % 2 == 0)
return
在 Scala 中不是必需的,甚至是一种不好的做法。这种情况下的问题是,即使代码是“正确”,类型检查器也会看到您从for each 返回Unit
。我建议您关注tour of scala,以便您熟悉语法。 - 最后,*Scala 的 List 是为递归而设计的,我相信你应该在这里使用它。
我试图了解为什么我的解决方案不起作用。我知道如果我删除 else
块并将其放在 for 循环之外,这是可行的,但我想我不明白为什么。有这种洞察力的人会帮忙。
首先你的代码没有做你想做的事,因为它只会检查第一个元素。其次,您必须了解for (x <- gen) block
等同于gen.foreach(x => block)
所以最后,它只是对列表的所有元素应用了一些副作用......这不是你想要的。查看 tour 并尝试使用 recursion 来实现您的代码,如果您遇到困难,请编辑问题并标记我。
好的,谢谢,我去参观一下。
【参考方案1】:
如果要检查是否至少有一个偶数,请使用exists
:
def listEvenChecker2(aList: List[Int]): Boolean =
aList.exists(_%2 == 0)
如果要检查它们是否都是偶数,请使用forall
:
def listEvenChecker2(aList: List[Int]): Boolean =
aList.forall(_%2 == 0)
【讨论】:
【参考方案2】:来自for-comprehensions 上的 scala 文档,它显示了一个示例:
示例 1
for(x <- c1; y <- c2; z <-c3) ...
被翻译成
c1.foreach(x => c2.foreach(y => c3.foreach(z =>...)))
如您所见,您拥有的 for 表达式已转换为 aList.foreach
调用,该调用返回 Unit
而不是 Boolean
【讨论】:
以上是关于检查列表中的偶数,并在 Scala 中获得类型不匹配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章