暗黙的な処理を行う場合、いくつかの便利なコンパイラフラグがあります:-Xlog-implicits
、-Xprint:typer
および-Ytyper-debug
この場合、-Xprint:typer
フラグを使用して、暗黙が適用された式を表示できます。次に、最初のスニペット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]
ます(append=+およびzero=0)
2番目のスニペットは、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]
(append=*およびzero=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)