【问题标题】:How to choose multiplication monoid instead of addition monoid?如何选择乘法幺半群而不是加法幺半群?
【发布时间】:2014-10-22 08:38:11
【问题描述】:

我想合并两个列表:

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 中执行此操作的惯用方式是什么?

【问题讨论】:

标签: scala scalaz


【解决方案1】:

你可以使用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)

不过,使用标签更为惯用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2016-08-01
    • 2018-10-05
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多