2014-10-22 10 views
5

Voglio unire due liste:Come scegliere la moltiplicazione monoide invece di aggiunta monoide?

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) 

Questo utilizza l'aggiunta di standard monoide implicitamente. Cosa succede se voglio usare la moltiplicazione monoid invece? Qual è il modo idiomatico di farlo in Scalaz?

+0

Immagino che tu possa farlo con un Tag: http://eed3si9n.com/learning-scalaz/Monoid.html#Tags.Multiplication –

risposta

7

È possibile utilizzare il tag Multiplication per indicare che si desidera utilizzare il monoide moltiplicazione:

import scalaz.Tags.Multiplication 

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

E poi:

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

Multiplication.unwrap rimuove il tag.

Si potrebbe anche passare in modo esplicito nella vostra propria istanza:

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

uso dei nomi è più idiomatico, però.

Problemi correlati