当前位置: 首页 > 知识库问答 >
问题:

Scala用于理解orElse而不是平面图

尚恩
2023-03-14

我非常熟悉< code>for comprehension和< code>flatMap on Options。

所以我知道你可以这样做

val a: Option[_] = for {
  foo <- Some(x)
  bar <- Some(y)
  baz <- Some(z)
} yield baz

如果理解中没有任何内容是 None,则给了我 Some(z),因为它正在对每个语句执行 flatMap

但实际上我在寻找相反的东西。我想遍历到< code>for理解,只要一切都是< code>None,就像< code>for理解中的< code>orElse一样。

例如:

val b: Option[_] = for {
    foo <- None
    bar <- Some(x)
    baz <- None
} yield *return the one with some*

有没有类似的东西,或者最好的方法是什么?

提前感谢!

共有2个答案

宗沛
2023-03-14

在你的场景中,一个用于理解的方法是没有意义的。你最好把这些物品放在一个集合中,然后拿出一个非“无”的。

也许是这样的东西?

val xs: List[Option[Int]] = List(None, Some(1), None)
xs.reduce(_ orElse _) // Some(1)

val ys: List[Option[Int]] = List(None, None)
ys.reduce(_ orElse _) // None
龙晟睿
2023-03-14

< code>reduce在找到< code>Some时不会短路(即,即使第一个元素是< code>Some,千元素列表也会进行一千次比较)。< code>find(_。is defined) < code > flatten 将停止并返回它找到的第一个< code>Some。下面只做2次比较(而不是5次)。

val xs: List[Option[Int]] = List(None, Some(1), None, Some(2), None, Some(3))
xs.find(_.isDefined).flatten
 类似资料:
  • 范畴理论中的单子是由三元组T、单位、平层等定义的。 KleisliTriple通过以下操作符对结构进行扁平化处理:(或Haskell中的),即由和组成。 但是,我一直认为,通过用这样的对象扁平化结构来组合函数,会更容易理解和实现函数编程中的单元体conept,即和的组合。 在本例中,。实际上,我在JavaScript中是以这种方式实现的,并且使用和(只是一个遗留的函数运算符),似乎可以获得Mona

  • 任务是实现递归方法,返回 Future 并且由于这一部分("在其他递归(结果::: res,尝试1)")代码失败与错误,因为它期望未来[Seq[结果]],但实际上返回未来[对象]。 据我所知,问题在于yield块内的表达式必须返回Seq[Result],以便将来由Monad进行后续包装。但是“递归(结果::res,尝试1)”将返回未来。因此,不是预期的Seq[Result]收益率,而是包含未来的[

  • 问题内容: 他们在Play Framework的首页上声称“ JSON是头等公民”。我还没有看到证明。 在我的项目中,我正在处理一些非常复杂的JSON结构。这只是一个非常简单的示例: 现在,我知道Play正在使用Jackson解析JSON。我在Java项目中使用Jackson,并且会做如下简单的事情: 这将很好地将我的JSON解析为我想要的Map对象-字符串和对象对Map,并允许我轻松地将数组转换

  • 我有两个函数返回期货。我正试图使用for-yield理解将第一个函数的修改结果输入到另一个函数中。 此方法有效: 然而,我对“如果”在那里不满意,似乎我应该能够使用地图。 但是当我尝试使用地图时: 我得到一个编译错误: 我尝试了一些变化,但没有发现任何有吸引力的工作。有人能提出更好的理解和/或解释我的第二个例子的错误吗? 下面是一个最小但完整的Scala 2.10可运行示例:

  • 有没有可能实现这样的事情: 我希望清楚我的意图是什么。

  • 在下面的示例中,我得到异常 当检查< code>if( i == 2 )失败时,我希望得到结果< code>Future( Test2 )。我如何在一个处理组合未来的for理解中处理filter/if? 下面是一个在Scala REPL中工作的简化示例。 代码: