2014-10-22 67 views
5

我要合并两个列表:如何选择乘法monoid而不是加法monoid?

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中做到这一点的惯用方法是什么?

+0

我想你可以用标签做到这一点:http://eed3si9n.com/learning-scalaz/Monoid.html#Tags.Multiplication – 2014-10-22 09:11:33

回答

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[[email protected]@[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) 

使用的标签是更地道,虽然。