处理隐式时有一些方便的编译器标志-Xlog-implicits
:-Xprint:typer
和-Ytyper-debug
在这种情况下,您可以使用-Xprint:typer
flag 查看具有应用隐式的表达式。然后,第一个片段List(3, 4, 5).asMA.foldMap(identity)
将扩展为
scalaz.this.Scalaz.SeqMA[List, Int](immutable.this.List.apply[Int](3, 4, 5)).asMA.foldMap[Int]({
((x: Int) => scala.this.Predef.identity[Int](x))
})(scalaz.this.Foldable.ListFoldable,
scalaz.this.Monoid.monoid[Int](scalaz.this.Semigroup.IntSemigroup, scalaz.this.Zero.IntZero));
现在很明显
Monoid.monoid[Int](Semigroup.IntSemigroup, Zero.IntZero)
用于创建Monoid[Int]
实例(附加 = + 和零 = 0)
第二个片段,List(3, 4, 5).foldMap(multiplication)
将扩展为
scalaz.this.Scalaz.SeqMA[List, Int](immutable.this.List.apply[Int](3, 4, 5)).foldMap[scalaz.IntMultiplication]({
((n: Int) => scalaz.Scalaz.multiplication(n))
})(scalaz.this.Foldable.ListFoldable,
scalaz.this.Monoid.monoid[scalaz.IntMultiplication](scalaz.this.Semigroup.IntMultiplicationSemigroup, scalaz.this.Zero.IntMultiplicationZero));
在这种情况下Monoid[IntMultiplication]
(附加 = * 和零 = 1)用作隐式参数。
更新
要Monoid
为您的类型创建,您需要具有隐式Semigroup
和Zero
范围内
case class Foo(x: Int)
implicit def FooSemigroup: Semigroup[Foo] = semigroup((f1, f2) => Foo(f1.x + f2.x))
implicit def FooZero: Zero[Foo] = zero(Foo(0))
scala> (1 to 10) map Foo foldMap identity
res5: Foo = Foo(55)