如何找出在 scalaz 中将 Monoid 用于 Map 时会发生什么

How to find out what happens when I use Monoid for Map in scalaz

  1. 如何找到 Monoid 的所有实例。例如,如何知道 scalaz 中是否存在 MapMonoid 实例? 如果是,它在源代码中的位置。 我尝试了以下但没有成功

    @ implicitly[Monoid[Map[_, _]]]
    Main.scala:1146: could not find implicit value for parameter e: scalaz.Monoid[Map[_, _]]
    implicitly[Monoid[Map[_, _]]]
              ^
    Compilation Failed
    
  2. 当我从 REPL 执行代码时,如何查看发生了什么(隐式转换,...​​),例如

    Map("a", 1) |+| Map("a", 1)
    
  1. 无法找到类型 class 的所有实例。

    特别是 Map 它取决于值的类型,因为 Map[K, V] 幺半群实例需要 Semigroup[V] 实例。

    您可以在 scalaz.std.map.

  2. 中找到 MapMonoid 的代码
  3. 你可以看到使用反射的隐式转换:

    import scalaz.std.map._
    import scalaz.std.anyVal._
    import scalaz.syntax.semigroup._
    
    import scala.reflect.runtime.universe._
    
    showCode(reify { Map("a" -> 1) |+| Map("a" -> 1)  }.tree)
    // `package`.monoid.ToSemigroupOps(
    //   Predef.Map.apply(Predef.ArrowAssoc("a").->(1)))
    //   (map.mapMonoid(Predef.this.DummyImplicit.dummyImplicit, anyVal.intInstance))
    //   .|+|(Predef.Map.apply(Predef.ArrowAssoc("a").->(1)))
    

    工作中的 Scalaz 隐式是:

    • 语法转换ToSemigroupOps|+|操作添加到Map
    • Map[String, Int]Monoid 实例使用 Semigroup[Int] 实例。