首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for-comprehension引发类型不匹配编译器错误

for-comprehension引发类型不匹配编译器错误
EN

Stack Overflow用户
提问于 2020-05-13 07:10:21
回答 2查看 101关注 0票数 1

我想从Iterable[Try[Int]]中提取所有有效值的列表(Iterable[Int])

代码语言:javascript
复制
val test = List(
    Try(8), 
    Try(throw new RuntimeException("foo")), 
    Try(42), 
    Try(throw new RuntimeException("bar"))
)

以下是从test打印所有有效值的方法

代码语言:javascript
复制
for {
    n <- test
    p <- n
} println(p)

// Output
// 8
// 42

但是,当我尝试将有效值保存到列表时,我收到了一个错误:

代码语言:javascript
复制
val nums: Seq[Int] = for {
    n <- list
    p <- n    // Type mismatch. Required: IterableOnce[Int], found Try[Int]
} yield(p)
println(nums)

如何修复该错误以及引发该错误的原因?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-13 07:14:33

尝试收集

代码语言:javascript
复制
test.collect { case Success(value) => value }
// res0: List[Int] = List(8, 42)

在for- corresponds格式中,与

代码语言:javascript
复制
for { Success(p) <- test } yield p

两者都利用了Constructor Patterns,它在幕后执行isInstanceOf类型测试,然后是asInstanceOf类型转换。Verbosly,它对应于类似于

代码语言:javascript
复制
test
  .filter (_.isInstanceOf[Success[Int]])
  .map    (_.asInstanceOf[Success[Int]].value)

下面的for-comprehension不起作用,因为其中的monad必须对齐

代码语言:javascript
复制
for {
  n <- test  // List monad
  p <- n     // does not align with Try monad
} yield (p)

上面的for-comprehension去糖化成

代码语言:javascript
复制
test.flatMap((n: Try[Int]) => n.map((p: Int) => p))

看一下flatMap的签名,我们看到它需要一个函数

代码语言:javascript
复制
Try[Int] => IterableOnce[Int]

同时我们还提供

代码语言:javascript
复制
Try[Int] => Try[Int]

因为n.map((p: Int) => p)返回Try[Int]。现在,下面的for- different是一个完全不同的问题

代码语言:javascript
复制
for {
    n <- test
    p <- n
} println(p)

由于缺少yield,因此它可以简化为

代码语言:javascript
复制
test.foreach((n: Try[Int]) => n.foreach((p: Int) => println(p)))

其中foreach需要以下类型的函数

代码语言:javascript
复制
Try[Int] => Unit

我们确实提供了它,因为n.foreach((p: Int) => println(p))确实返回了Unit

票数 5
EN

Stack Overflow用户

发布于 2020-05-13 10:30:01

您还可以尝试:

代码语言:javascript
复制
val nums: Seq[Int] = list.map(_.toOption).flatten

代码语言:javascript
复制
val nums: Seq[Int] = list.flatMap(_.toOption)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61763561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档