2016-05-28 1 views
4
  1. Как найти все экземпляры Monoid. Например, как узнать, есть ли Monoid экземпляр для Map в scalaz? И если да, то где он находится в исходном коде. Я попытался следующие без успехаКак узнать, что произойдет, когда я использую Monoid для Map в scalaz

    @ implicitly[Monoid[Map[_, _]]] 
    Main.scala:1146: could not find implicit value for parameter e: scalaz.Monoid[Map[_, _]] 
    implicitly[Monoid[Map[_, _]]] 
         ^
    Compilation Failed 
    
  2. Как я могу видеть, что происходит (неявные преобразования, ...), когда я выполняю код из РЕПЛ, как

    Map("a", 1) |+| Map("a", 1) 
    

ответ

5
  1. Невозможно найти все экземпляры класса типа.

    В частности, для Map это зависит от типа значений, поскольку экземпляр моноида Map[K, V] нуждается в экземпляре Semigroup[V].

    Вы можете найти код для Map's Monoid в 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))) 
    

    В implicits Scalaz на работе:

    • Синтаксис преобразования ToSemigroupOps добавить |+| операцию Map.
    • Экземпляр Monoid для Map[String, Int], который использует экземпляр Semigroup[Int].
+0

Есть ли неявное преобразование без использования скаляза? – melston

Смежные вопросы