我如何形成scala SortedMaps的联合?
(我正在使用
Scala nightlies,并在2.8.0b1 RC4中看到相同的行为.我是Scala的新手.)
我有两个SortedMaps,我想形成联盟.这是我想要使用的代码: import scala.collection._ object ViewBoundExample { class X def combine[Y](a: SortedMap[X,Y],b: SortedMap[X,Y]): SortedMap[X,Y] = { a ++ b } implicit def orderedX(x: X): Ordered[X] = new Ordered[X] { def compare(that: X) = 0 } } 这里的想法是’隐式’语句意味着Xs可以转换为Ordered [X],然后将SortedMaps组合成另一个SortedMap,而不仅仅是一个map. 当我编译时,我得到了 sieversii:scala-2.8.0.Beta1-RC4 scott$bin/scalac -versionScala compiler version 2.8.0.Beta1-RC4 -- Copyright 2002-2010,LAMP/EPFL sieversii:scala-2.8.0.Beta1-RC4 scott$bin/scalac ViewBoundExample.scala ViewBoundExample.scala:8: error: type arguments [ViewBoundExample.X] do not conform to method ordered's type parameter bounds [A <: scala.math.Ordered[A]] a ++ b ^ one error found 如果该类型参数绑定是[A<%scala.math.Ordered [A]]而不是[A<:scala.math.Ordered [A]],那么我的问题似乎就会消失.不幸的是,我甚至无法找出“命令”生活的方法!任何人都可以帮我追踪它吗? 如果做不到这一点,我打算如何制作两个SortedMaps的联合?如果我删除了返回类型的组合(或将其更改为Map)一切正常 – 但是我不能依赖返回的排序! 解决方法
目前,您使用的是scala.collection.SortedMap特征,其方法继承自MapLike特征.因此,您会看到以下行为:
scala> import scala.collection.SortedMap import scala.collection.SortedMap scala> val a = SortedMap(1->2,3->4) a: scala.collection.SortedMap[Int,Int] = Map(1 -> 2,3 -> 4) scala> val b = SortedMap(2->3,4->5) b: scala.collection.SortedMap[Int,Int] = Map(2 -> 3,4 -> 5) scala> a ++ b res0: scala.collection.Map[Int,2 -> 3,3 -> 4,4 -> 5) scala> b ++ a res1: scala.collection.Map[Int,4 -> 5) 返回结果的类型是Map [Int,Int],因为这将是MapLike对象返回方法的唯一类型.似乎保留了SortedMap的sorted属性,我想这是因为使用抽象方法来进行连接,并且这些抽象方法被定义为保持map的顺序. 为了拥有两个有序映射的联合,我建议你使用scala.collection.immutable.SortedMap. scala> import scala.collection.immutable.SortedMap import scala.collection.immutable.SortedMap scala> val a = SortedMap(1->2,3->4) a: scala.collection.immutable.SortedMap[Int,4->5) b: scala.collection.immutable.SortedMap[Int,4 -> 5) scala> a ++ b res2: scala.collection.immutable.SortedMap[Int,4 -> 5) scala> b ++ a res3: scala.collection.immutable.SortedMap[Int,4 -> 5) SortedMap特征的这种实现声明了一个返回SortedMap的方法. 现在,您对类型边界的问题有几个答案: > Ordered [T]是一个特征,如果在一个类中混合,它指定可以使用< ;,>,=,> =,< =来比较该类.你只需要定义抽象方法compare(that:T),它为此返回-1<那,1为此>那个和0对于这个==那个.然后基于比较结果在特征中实现所有其他方法. 虽然,我仍然觉得奇怪的是scala.collection.SortedMap没有提供一个返回SortedMap的方法作为结果.我所做的所有有限测试似乎都表明,两个scala.collection.SortedMaps的串联结果确实产生了一个保存已排序属性的映射. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |