取消选择选项

Knu*_*daa 40 monads scala join flatten option

说我有一个val s: Option[Option[String]].因此它可以具有以下值:

Some(Some("foo")) Some(None) None

我想减少它,以便第一个成为Some("foo")另外两个成为None.很明显,有很多方法可以实现这一目标,但我正在寻找一种简单的,可能是内置的,不足一线的.

Rex*_*err 36

遗憾的是,这是一种耻辱flatten.这应该.

Flatten现在确实存在.

像之前一样,

s getOrElse None
Run Code Online (Sandbox Code Playgroud)

(除了其他答案)也会做同样的事情.

  • 似乎现在存在:scala> Some(Some(1)).flatten res10:Option [Int] = Some(1) (5认同)

oxb*_*kes 16

你可以使用scalaz join要做到这一点,因为这是一个一元操作:

doubleOpt.join
Run Code Online (Sandbox Code Playgroud)

这是在REPL中:

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> some(some("X")).join
res0: Option[java.lang.String] = Some(X)

scala> some(none[String]).join
res1: Option[String] = None

scala> none[Option[String]].join
res3: Option[String] = None
Run Code Online (Sandbox Code Playgroud)

任何具有Monad的类型类实例的东西都可以使用它.


Dav*_*ith 13

s.flatten
Run Code Online (Sandbox Code Playgroud)

然后是一堆字符,让我达到stackoverflow允许的最小值

  • 人们也可以写出"flatMap身份". (7认同)
  • 嗯,这很奇怪.他们为什么要那样做?请尝试使用s.flatmap(x => x). (6认同)
  • 总结以上内容:`List(Some(Some("foo")),Some(None),None)map {_ flatMap identity}`yield`List [Option [java.lang.String]] = List(Some(foo) ),无,无)`,我认为是克努特(OP和第一只非极熊幼崽命名为"Knut",我听说过)想要的. (2认同)