gpt4 book ai didi

Scala - Flatmap 一系列选项和可遍历

转载 作者:行者123 更新时间:2023-12-03 09:19:26 32 4
gpt4 key购买 nike

考虑在某些大小写匹配上编写的 flatMap。例如:

list.flatMap( v =>
v match {
case Cond1 => if(something) Some(Int) else None
//..Other conditions yielding Option[Int]
case CondN => if(somethingelse) Seq(Int) else Seq()
})

但是这不会编译。如果 seq 是 Option[Int] 的全部或 Seq[Int] 的全部,则 flatMap 可以工作。但如果 Seq 是选项和 Seq 的混合,则不然。为什么会有这样的限制?这是否解决了我现在无法想到的特定歧义。

编辑1从 REPL 添加代码片段

scala> val a = Seq(Option(1), Seq(2,3))
a: Seq[Equals] = List(Some(1), List(2, 3))

scala> val b = Seq(Seq(1), Seq(2,3))
b: Seq[Seq[Int]] = List(List(1), List(2, 3))

scala> a.flatMap(x=>x)
<console>:9: error: type mismatch;
found : Equals
required: scala.collection.GenTraversableOnce[?]
a.flatMap(x=>x)
^

scala> b.flatMap(x=>x)
res24: Seq[Int] = List(1, 2, 3)

编辑2在 Filippo 的回答之后,我在 REPL 中尝试了以下代码,它成功了。

scala> val options = Seq("opt1", "opt2")
options: Seq[String] = List(opt1, opt2)

scala> options.flatMap( x =>
| x match {
| case "opt1" => Some(1)
| case "opt2" => Seq(2,3)
| case _ => None
| })
res27: Seq[Int] = List(1, 2, 3)

每种情况下的分辨率有何不同。更重要的是,当我使用 map 而不是 flatMap 时,结果与我创建的 Seq a 相同。

scala> options.map( x => 
| x match {
| case "opt1" => Some(1)
| case "opt2" => Seq(2,3)
| case _ => None
| })
res28: Seq[Equals] = List(Some(1), List(2, 3))

最佳答案

Option 是一个 GenTraversableOnce 但 scala 需要一些帮助:

  val a: Seq[TraversableOnce[Int]] = Seq(Option(1), Seq(2,3))
a.flatMap(x=>x)

res0: Seq[Int] = List(1, 2, 3)

添加问题后

编辑

我认为,如果您的序列类型是您所期望的类型,那么一切都归结为传递给 flatMap 的函数。如果当起始序列是 Seq[A] 时 scala 无法弄清楚该函数是 (A) => Traversable[A] ,我认为我们应该做一些显式类型。

现在,回到你的第一个示例,我将其重构为:

list.flatMap {
case Cond1 if something => Seq(Int)
case CondN if somethingelse => Seq(Int)
case _ => Seq()
}

毫无疑问,scala 现在能够正确推断类型。

关于Scala - Flatmap 一系列选项和可遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34148804/

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