4
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 与 Map 一样强大?

4

1 回答 1

4

因为Semigroup是不变的并且没有专门为 定义的实例HashMap,只是Map. 不变性基本上意味着|+|语法不能在推断为的类型上使用Semigroup实例,即使是 的子类型。MapHashMapHashMapMap

在某些情况下,Scalaz 类型类不必要地保持不变。不过,这不是其中一种情况。由于|+|函数的签名,方差(co-或contra-)没有多大意义,因此类型类在其最大通用性上是正确的。

于 2013-08-28T16:54:01.680 回答