我非常熟悉< 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*
有没有类似的东西,或者最好的方法是什么?
提前感谢!
在你的场景中,一个用于理解的方法是没有意义的。你最好把这些物品放在一个集合中,然后拿出一个非“无”的。
也许是这样的东西?
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
< 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中工作的简化示例。 代码: