scala - scalaz Foldable compose -
i have next code
val listoption: list[option[int]] = list(1.some, none, 2.some) i want fold elements, write next code
val result = listx.fold(0.some)((acc, el) => { (acc, el) match { case (some(a), some(b)) => some(a + b) case (some(a), _) => some(a) case (_, some(b)) => some(b) case _ => el } }) println(result.getorelse(0)) // => 3 this workds fine, see in scalaz sources next tric
val composefold = foldable[list] compose foldable[option] composefold.fold(listoption) // => 3 but not understand how correct work, , why scalaz not mix methods listoption instance, , differenct between scala fold , scalaz fold
the scalaz fold function uses monoid instance of elements, don't have supply start value , function combine elements.
a monoid has 2 functions zero/empty , append/combine. int :
val intmonoid = new monoid[int] { def 0 = 0 def append(a: int, b: => int) = + b } using monoid[int] can write scalaz fold scala fold :
import scalaz.foldable import scalaz.std.list._ import scalaz.std.anyval._ val numbers = list(1,2,3) foldable[list].fold(numbers) // 6 // analogous following scala fold numbers.fold(intmonoid.zero)(intmonoid.append(_,_)) // 6 we can combine foldable[list] , foldable[option] showed :
import scalaz.std.option._ foldable[list].fold(list(1,2)) // 3 foldable[option].fold(1.some) // 1 foldable[option].fold(none[int]) // 0 val foldlisto = foldable[list] compose foldable[option] foldlisto.fold(list(1.some, none, 2.some)) // 3 you can use foldable syntax import , use concatenate or suml/sumr (there fold clashes list.fold , option.fold) :
import scalaz.syntax.foldable._ list(1,2,3).concatenate // 6 1.some.concatenate // 1 list(1.some, none, 2.some).concatenate.concatenate // 3 instead of specific imports scalaz.std.list._ , scalaz.syntax.foldable._, use uber imports import scalaz._, scalaz._.
Comments
Post a Comment