SortedMap的scalaz Monoid

问题描述 投票:2回答:2

我相信scalaz同时具有Map和SortedMap的monoid实例。

但是这不起作用

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)
                         ^
scala scalaz
2个回答
3
投票

Scalaz仅提供不可变的数据结构实例。

您应添加import scalaz.std.sortedMap._并使用scala.collection.immutable.SortedMapscala.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
投票

如果第二个参数是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的问题应该有更好的答案!

我没有时间去调查更多……很糟糕。

关键是这里我们使用to实例作为此处结果的生成器。

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

shortly:不要将此答案标记为有效答案:不是。可能您不应该依赖于实现细节。仍然有可能,这个答案可能对某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.