def foo(a: Map[String, Int], b: HashMap[String, Int]) {
// okay
val ab = a |+| b
// value |+| is not a member of scala.collection.immutable.HashMap[String,Int]
val ba = b |+| a
}
为什么HashMaps不是Semigroups,而是Maps?来自面向对象的背景,我原本期望HashMap能像地图一样有能力吗?
答案 0 :(得分:4)
由于Semigroup
是不变的,并且没有为具体HashMap
定义实例,只需Map
。不变性基本上意味着|+|
语法不能在Semigroup
上使用Map
实例来推断为HashMap
的类型,即使HashMap
是Map
的子类型。
在某些情况下,Scalaz类型类是不必要的不变量。但这不是其中之一。由于|+|
函数的签名,方差(共同或反对)没有多大意义,因此类型类的最大通用性是正确的。