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

时间:2014-10-22 08:38:11

标签: scala scalaz

我想合并两个列表:

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)

这隐式使用标准加法monoid。如果我想使用乘法幺半群怎么办?在Scalaz中这样做的惯用方法是什么?

1 个答案:

答案 0 :(得分: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)

然而,使用标签更为惯用。