Cartesian product traverse in scalaz

前端 未结 4 834
逝去的感伤
逝去的感伤 2021-02-10 03:06

In Eric Torreborre\'s blogpost on the paper Essence of the Iterator Pattern, he describes how the cartesian product of a traverse is also a traverse.

Can anyone show me

4条回答
  •  Happy的楠姐
    2021-02-10 03:56

    You don't see a big win here, as you're just promoting plain ol' Monoids into Applicatives so you fuse them together.

    import scalaz.std.anyVal._, scalaz.std.list._, scalaz.std.string._
    val Sum = Monoid[Int].applicative
    val Concat = Monoid[List[String]].applicative
    val A: Applicative[({type λ[α] = (Int, List[String])})#λ] = Sum.product[({type λ[α]=List[String]})#λ](Concat)
    
    val xs = List(1, 2, 3, 4)
    val (sum, text) = A.traverse(xs)(a => (a, List(a.toString + "Z")))
    println(sum, text) // 10, List("1Z", "2Z", "3Z", "4Z")
    

    Might as well just use Monoid[(Int, List[String])] for the stated problem:

    import scalaz._, std.tuple._
    val (sum1, text1) = Foldable[List].foldMap(xs)(a => (a, List(a.toString + "Z")))
    println(sum1, text1) // 10, List("1Z", "2Z", "3Z", "4Z")
    

    Things get more interesting if one of the effects you want to traverse with is a non-trivial Applicative, like State.

提交回复
热议问题