作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读一本书,内容如下:
sealed trait Currency
case object USD extends Currency
... other currency types
case class Money(m: Map[Currency, BigDecimal]) {
... methods defined
}
Money
上的某些类型的操作。因为是 Monoidal 所以我们要创建一个
Monoid
为
Money
.但是接下来是我无法正确解析的列表。
zeroMoney
的定义.这是按如下方式完成的:
final val zeroMoney: Money = Money(Monoid[Map[Currency, BigDecimal]].zero)
Money
里面的部分参数列表。具体来说
Monoid[Map[Currency, BigDecimal]].zero
zero
Monoid[Map[A,B]]
的函数那么这是什么意思?
implicit def MoneyAdditionMonoid = new Monoid[Money] {
val m = implicitly(Monoid[Map[Currency, BigDecimal]])
def zero = zeroMoney
def op(m1: Money, m2: Money) = Money(m.op(m1.m, m2.m))
}
op
的定义考虑到其他一切都很好,所以这不是问题。但是我还是不明白是什么
zeroMoney
给出了它的定义。这也给我带来了与隐式
m
相同的问题以及。
Monoid[Map[Currency, BigDecimal]]
到底是做什么的?其实呢?自
Monoid
以来,我看不到它是如何构造任何东西的是一个没有实现的特征。不定义怎么用
op
和
zero
第一的?
最佳答案
要编译此代码,您需要如下内容:
trait Monoid[T] {
def zero: T
def op(x: T, y: T): T
}
object Monoid {
def apply[T](implicit i: Monoid[T]): Monoid[T] = i
}
Monoid[Map[Currency, BigDecimal]].zero
脱糖成
Monoid.apply[Map[Currency, BigDecimal]].zero
,简化为
implicitly[Monoid[Map[Currency, BigDecimal]]].zero
.
zero
在 Monoidal 上下文中是这样的元素
Monoid[T].op(Monoid[T].zero, x) ==
Monoid[T].op(x, Monoid[T].zero) ==
x
Map
的情况下,我会假设
Monoid
结合 map 与
++
.
zero
然后就是
Map.empty
,这是什么
Monoid[Map[Currency, BigDecimal]].zero
最后简化为。
Map[A, B]
is aMonoid
ifB
is aMonoid
++
建议的方法不同。 .让我们看一个例子。您希望以下 map 如何组合在一起:?
Map(€ → List(1, 2, 3), $ → List(4, 5))
Map(€ → List(10, 15), $ → List(100))
Map(€ → List(1, 2, 3, 10, 15), $ → List(4, 5, 11))
,这是唯一可能的,因为我们知道如何组合两个列表。
Monoid[List[Int]]
我在这里隐式使用的是
(Nil, :::)
.通用型
B
你还需要一些东西来粉碎两个
B
一起,这个东西叫做
Monoid
!
Monoid[Map[A, B]]
我猜这本书想要定义:
implicit def mm[A, B](implicit mb: Monoid[B]): Monoid[Map[A, B]] =
new Monoid[Map[A, B]] {
def zero: Map[A, B] = Map.empty
def op(x: Map[A, B], y: Map[A, B]): Map[A, B] =
(x.toList ::: y.toList).groupBy(_._1).map {
case (k, v) => (k, v.map(_._2).reduce(mb.op))
}.toMap
}
关于Scala Monoid[Map[A,B]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42600662/
我是一名优秀的程序员,十分优秀!