Scalaz Monoid for SortedMap
scalaz Monoid for SortedMap
我相信 scalaz 有 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)
^
如果第二个参数是 SortedMap(就像 scala 集合那样),Scalaz 将使用 SortedMap,但这是实现细节,您不应该依赖它。
//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]]
已编辑
这是实现细节,您应该知道这一点!这个问题应该有更好的答案,使用现有的 scalaz 实现 sortedMap!
没时间再研究了……抱歉。
这是 scalaz 中 SortedMap 的一些实现,但不知道如何使用它们:(。
https://github.com/scalaz/scalaz/blob/7e64f43872fc944b54a63e4262acaea2248f50c8/core/src/main/scala/scalaz/std/SortedMap.scala
这里是旧的实现。我很难找到当前的,但假设是相似的。
https://scalaz.github.io/scalaz/scalaz-2.9.1-6.0.4/doc.sxr/scalaz/Semigroup.scala.html#114426
关键在这里,我们在这里使用 to
实例作为结果的构建器。
//from implementation of |+|
from.foldLeft(to) { case (to, (k, v)) => to + ... }
不久:不要将此答案标记为有效答案:它不是。可能你不应该依赖实现细节。仍然有可能,这个答案可能对某人有帮助。
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)
我相信 scalaz 有 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)
^
如果第二个参数是 SortedMap(就像 scala 集合那样),Scalaz 将使用 SortedMap,但这是实现细节,您不应该依赖它。
//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]]
已编辑 这是实现细节,您应该知道这一点!这个问题应该有更好的答案,使用现有的 scalaz 实现 sortedMap!
没时间再研究了……抱歉。
这是 scalaz 中 SortedMap 的一些实现,但不知道如何使用它们:(。 https://github.com/scalaz/scalaz/blob/7e64f43872fc944b54a63e4262acaea2248f50c8/core/src/main/scala/scalaz/std/SortedMap.scala
这里是旧的实现。我很难找到当前的,但假设是相似的。 https://scalaz.github.io/scalaz/scalaz-2.9.1-6.0.4/doc.sxr/scalaz/Semigroup.scala.html#114426
关键在这里,我们在这里使用 to
实例作为结果的构建器。
//from implementation of |+|
from.foldLeft(to) { case (to, (k, v)) => to + ... }
不久:不要将此答案标记为有效答案:它不是。可能你不应该依赖实现细节。仍然有可能,这个答案可能对某人有帮助。
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)