林想知道是否有一個簡短的手摺疊選項的地圖。例如斯卡拉,摺疊選項
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上創建一個隱式函數來處理這個問題,但是我想知道是否有更好的方法,我沒有想到。
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)
您是在用自己的方式[重新發現monads](http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html)!除了提供一種嵌入值的方法(這裏是'Some')(以及在後者中),拆分嵌套結構/提供'flatMap' /'mapOption'-like函數的能力是構成monad的一半。情況下,一個'地圖'操作)。 – 2012-08-14 05:37:47