gpt4 book ai didi

Scala:在for循环中索​​引Seq而不是List

转载 作者:行者123 更新时间:2023-12-04 19:51:27 34 4
gpt4 key购买 nike

以下代码显示类型不匹配错误:

def f(arr:List[Int]): List[Int] = 
for(num <- 0 to arr.length-1; if num % 2 == 1) yield arr(num)

据说它找到了一个IndexedSeq而不是 List .以下作品:

def f(arr:List[Int]): List[Int] = 
for(num <- (0 to arr.length-1).toList; if num % 2 == 1) yield arr(num)

我用过i <- a to b在 for 循环之前,但之前没有看到这个错误。有人可以解释为什么格式 i <- a to b不能在这里使用?

最佳答案

因为0 to arr.length-1返回类型是:IndexedSeq[Int],所以执行for yield时也会yield IndexedSeq[Int] 类型的结果。

正确的函数定义:

 def f(arr:List[Int]):IndexedSeq[Int] = for( num <- 0 to arr.length-1 if num%2==1) yield arr(num)

for( num <- 0 to arr.length-1 if num%2==1) yield arr(num) 

将转化为:

scala> def f(arr:List[Int]) = (0 to arr.length-1).filter(i => i%2==1).map(i => arr(i))
f: (arr: List[Int])scala.collection.immutable.IndexedSeq[Int]

所以我们可以看到返回类型是由0到arr.length-1类型决定的。

(0 to arr.length-1).toList 将返回的 IndexedSeq[int] 类型更改为 List[Int]类型,因此 for yield 将生成类型为 List[Int] 的结果。

关于Scala:在for循环中索​​引Seq而不是List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33095902/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com