2014-10-22 64 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) 

使用的標籤是更地道,雖然。