2014-10-22 13 views
5

Tôi muốn kết hợp hai danh sách:Làm thế nào để chọn monoid nhân thay vì monoid bổ sung?

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) 

này sử dụng việc bổ sung tiêu chuẩn monoid ngầm. Điều gì sẽ xảy ra nếu tôi muốn sử dụng phép nhân nhân thay thế? Đó là cách thành ngữ để làm điều này trong Scalaz?

+0

Tôi đoán bạn có thể thực hiện việc này bằng Thẻ: http://eed3si9n.com/learning-scalaz/Monoid.html#Tags.Multiplication –

Trả lời

7

Bạn có thể sử dụng thẻ Multiplication để cho biết rằng bạn muốn sử dụng monoid nhân:

import scalaz.Tags.Multiplication 

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

Và sau đó:

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

Multiplication.unwrap loại bỏ các thẻ.

Bạn cũng có thể vượt qua một cách rõ ràng trong trường hợp của riêng bạn:

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

Sử dụng thẻ là thành ngữ hơn, mặc dù.

Các vấn đề liên quan