如何找出当我在scalaz中使用Monoid for Map时会发生什么

Yan*_*san 4 scala implicit-conversion scalaz

  1. 我怎样才能找到所有的实例Monoid.例如,如何知道scalaz中是否有Monoid实例Map?如果是的话,它在源代码中的位置.我试过以下没有成功

    @ implicitly[Monoid[Map[_, _]]]
    Main.scala:1146: could not find implicit value for parameter e: scalaz.Monoid[Map[_, _]]
    implicitly[Monoid[Map[_, _]]]
              ^
    Compilation Failed
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当我从REPL执行代码时,我怎么能看到会发生什么(隐式转换......)

    Map("a", 1) |+| Map("a", 1)
    
    Run Code Online (Sandbox Code Playgroud)

Pet*_*ens 5

  1. 无法找到类型类的所有实例.

    具体来说,Map它取决于值的类型,因为Map[K, V]monoid实例需要一个Semigroup[V]实例.

    你可以找到Map's Monoidin 的代码scalaz.std.map.

  2. 您可以使用反射查看隐式转换:

    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)))
    
    Run Code Online (Sandbox Code Playgroud)

    Scalaz在工作中的含义是:

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