为什么HashMaps不是Semigroups,而是Maps?

时间:2013-08-28 16:33:55

标签: scala map hashmap scalaz liskov-substitution-principle

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能像地图一样有能力吗?

1 个答案:

答案 0 :(得分:4)

由于Semigroup是不变的,并且没有为具体HashMap定义实例,只需Map。不变性基本上意味着|+|语法不能在Semigroup上使用Map实例来推断为HashMap的类型,即使HashMapMap的子类型。

在某些情况下,Scalaz类型类是不必要的不​​变量。但这不是其中之一。由于|+|函数的签名,方差(共同或反对)没有多大意义,因此类型类的最大通用性是正确的。