скалаз Monoid для SortedMap - PullRequest
2 голосов
/ 01 марта 2020

Я считаю, что у скалаза есть моноидные экземпляры для Map и SortedMap .

Но это не работает

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> Map(1 -> 1) |+| Map(1 -> 1)
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

scala> import scala.collection.SortedMap
import scala.collection.SortedMap

scala> SortedMap(1 -> 1) |+| SortedMap(1 -> 1)
<console>:19: error: value |+| is not a member of scala.collection.SortedMap[Int,Int]
       SortedMap(1 -> 1) |+| SortedMap(1 -> 1)
                         ^

Ответы [ 2 ]

3 голосов
/ 01 марта 2020

Scalaz предоставляет только неизменные экземпляры структуры данных.

Вы должны добавить import scalaz.std.sortedMap._ и использовать scala.collection.immutable.SortedMap вместо scala.collection.SortedMap.

Welcome to Scala 2.13.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_201).
Type in expressions for evaluation. Or try :help.

scala> scalaz.BuildInfo
res0: scalaz.BuildInfo.type = version: 7.2.30, scalaVersion: 2.13.1

scala> import scalaz.std.sortedMap._
import scalaz.std.sortedMap._

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> scala.collection.SortedMap(1 -> 2) |+| scala.collection.SortedMap(1 -> 3)
                                          ^
       error: value |+| is not a member of scala.collection.SortedMap[Int,Int]
       did you mean ++:?

scala> scala.collection.immutable.SortedMap(1 -> 2) |+| scala.collection.immutable.SortedMap(1 -> 3)
res2: scala.collection.immutable.SortedMap[Int,Int] = TreeMap(1 -> 5)
1 голос
/ 01 марта 2020

Scalaz будет использовать SortedMap, если вторым аргументом является SortedMap (как в scala коллекциях), но это детали реализации, и вам не следует полагаться на него.

//If you only care about `Map` inteface then treat `SortedMap` as normal `Map`: 
val res = Map(1 -> 1) |+| SortedMap(1 -> 1)
println(res.getClass.getName) // scala.collection.immutable.TreeMap

//If you really need to have access to SortedMap api then you can cast to it:
val res2 = res.asInstanceOf[SortedMap[Int, Int]]

EDITED This это детали реализации, и вы должны знать об этом! Должен быть лучший ответ на этот вопрос, который использует существующую реализацию скалаза для sortedMap!

У меня нет времени исследовать больше ... sory.

ключ здесь, что мы используем to экземпляр в качестве компоновщика для результата здесь.

//from implementation of |+|
from.foldLeft(to) { case (to, (k, v)) => to + ... }

в скором времени : не отмечайте этот ответ как действительный: это не так. Возможно, вам не следует полагаться на детали реализации. Тем не менее, это возможно, и этот ответ может быть полезен для кого-то.

...