Options are Monads and we can perform operations in their underlying types in a typesafe way using Scalaz:
import scalaz._ import Scalaz._ val a: Option[BigDecimal] = BigDecimal("0.123").some val b: Option[BigDecimal] = BigDecimal("1.234").some val c: Option[BigDecimal] = BigDecimal("2.345").some println( (a |@| b |@| c) { _ + _ + _ } ) //yields: Some(3.702)
and if the chain is broken, we don’t have to worry since it’s getting short-circuited:
import scalaz._ import Scalaz._ val a: Option[BigDecimal] = BigDecimal("0.123").some val b: Option[BigDecimal] = None val c: Option[BigDecimal] = BigDecimal("2.345").some println( (a |@| b |@| c) { _ + _ + _ } ) //yields: None