scalaz - Scala flattening an Option around a higher kinded type, looking for a more idiomatic approach -
given higher kinded type m, , monad type class, can operate on values within m through for-comprehension. working function return options, im looking more appropriate way flatten these options solution have. follows
class test[m[+_]:monad](calc:calculator[m]) { import monad._ def dosomething(x:float):m[option[float]] = { { y:option[float] <- calc.divideby(x) // divideby returns m[option[float]] z:option[float] <- y.fold[m[option[float]]](implicitly[monad[m]].point(none))(i => calc.divideby(i)) } yield z } } so following i'm looking correct:
y.fold[m[option[float]]](implicitly[monad[m]].point(none))(i => calc.divideby(i)) also case instead of calling second divideby, call multiplyby returns m[float]
y.fold[m[option[float]]](implicitly[monad[m]].point(none))(i => calc.multipleby(i).map(some(_)) maybe case monad transformers im not sure how go it.
it seems monad transformers can here. example, following compiles , think want:
import scalaz._, scalaz._ abstract class calculator[m[_]: monad] { def divideby(x: float): m[option[float]] def multiplyby(x: float): m[float] } class test[m[_]: monad](calc: calculator[m]) { def dosomething(x: float): optiont[m, float] = { y <- optiont(calc.divideby(x)) z <- calc.multiplyby(y).liftm[optiont] } yield z } now dosomething returns optiont[m, float], kind of wrapper m[option[float]] allows work contents way inside option monadically. m[option[float]] optiont[m, float] can use run method.
Comments
Post a Comment