3

我想知道是否有折叠选项地图的短手。例如

def divideByThree(x:Int) = if (x == 0) None else Some(x/3)

val result = Some(6) map (divideByThree(_))
resut:Option[Option[Int]] = Some(Some(2))

为了解决这个问题,我做

val result = Some(6) match {
   case Some(i) => divideByThree(i)
   case None    => None
}

这似乎有点沉重。我可以在 Option 上创建一个隐式函数说 mapOption 来处理这个问题,但我想知道是否有更好的方法我没有想到。

4

3 回答 3

9

你可以flatMap像这样使用:

def divideByThree(x:Int) = if (x == 0) None else Some(x/3)

val opx = None // Or: Some(10)
val mapped = opx.flatMap(divideByThree)

println(mapped)
于 2012-08-13T11:09:48.443 回答
2

怎么样flatMap()?它会执行map然后flatten

val result = Some(6) flatMap (divideByThree(_))
result: Option[Int] = Some(2)
于 2012-08-13T11:11:44.137 回答
1

Scala 有一种单子语法:用于理解

val div = ( case x if x%3 == 0 => x/3} : PartialFunction[Int,Int] ).lift
val exp = (l : Option[Int]) => for {
             x <- l
             r <- div(x)
           } yield r

测试它:

scala> exp(Some(3))
res1: Option[Int] = Some(1)

scala> exp(Some(4))
res2: Option[Int] = None

scala> exp(None)
res3: Option[Int] = None
于 2012-08-13T18:35:39.977 回答