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 に答える