如何选择乘法幺半群而不是加法幺半群?

5
我想要合并两个列表:
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)

这里隐式地使用了标准的加法幺半群。如果我想使用乘法幺半群怎么办?在Scalaz中,有什么惯用的方法可以实现这一点吗?


我猜你可以使用Tag来完成这个操作:http://eed3si9n.com/learning-scalaz/Monoid.html#Tags.Multiplication - Sven Koschnicke
1个回答

7
你可以使用Multiplication标签来表示你想使用乘法单子:
import scalaz.Tags.Multiplication

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

然后:

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

Multiplication.unwrap可以移除标签。

您还可以明确地传入自己的实例:

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

使用标签更加符合语言习惯,不过。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接