How to choose multiplication monoid instead of addition monoid?
Asked Answered
O

1

5

I want to merge two lists:

import scalaz.syntax.align._
import scalaz.std.list._
import scalaz.std.anyVal._

List(1, 2, 3).merge(List(4, 5, 6, 7)) // Evaluates to List(5, 7, 9, 7)

This uses the standard addition monoid implicitly. What if I want use the multiplication monoid instead? What it is the idiomatic way to do this in Scalaz?

Ormond answered 22/10, 2014 at 8:38 Comment(1)
I guess you can do this with a Tag: eed3si9n.com/learning-scalaz/Monoid.html#Tags.MultiplicationLustig
A
7

You can use the Multiplication tag to indicate that you want to use the multiplication monoid:

import scalaz.Tags.Multiplication

val xs = List(1, 2, 3).map(Multiplication(_))
val ys = List(4, 5, 6, 7).map(Multiplication(_))

And then:

scala> xs merge ys
res0: List[scalaz.@@[Int,scalaz.Tags.Multiplication]] = List(4, 10, 18, 7)

Multiplication.unwrap removes the tag.

You could also explicitly pass in your own instance:

scala> List(1, 2, 3).merge(List(4, 5, 6, 7))(Monoid.instance(_ * _, 1))
res1: List[Int] = List(4, 10, 18, 7)

Using tags is more idiomatic, though.

Allineallis answered 22/10, 2014 at 9:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.