检查列表中的偶数,并在 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) returnScala 中不是必需的,甚至是一种不好的做法。这种情况下的问题是,即使代码是“正确”,类型检查器也会看到您从for each 返回Unit。我建议您关注tour of scala,以便您熟悉语法。 - 最后,*Scala 的 List 是为递归而设计的,我相信你应该在这里使用它。 我试图了解为什么我的解决方案不起作用。我知道如果我删除 else 块并将其放在 for 循环之外,这是可行的,但我想我不明白为什么。有这种洞察力的人会帮忙。 首先你的代码没有做你想做的事,因为它只会检查第一个元素。其次,您必须了解for (x &lt;- gen) block 等同于gen.foreach(x =&gt; 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 中获得类型不匹配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Scala中对列表/序列进行模式匹配时解决类型擦除问题

Scala隐式参数

平均一个很长的列表[双]而不在 Scala 中获得无穷大

Scala udf 检查 df 列值是不是在列表中

检查列表中的单词并在 pandas 数据框列中删除这些单词

如何从 firestore 检查有多少项目具有真值或假值并在列表中仅显示真值? - 颤动