2013-08-28 19 views
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 
} 

为什么不包含HashMap半群,但地图是?来自一个面向对象的背景,我会期望一个HashMap每一个像Map一样的能力?为什么HashMaps不是半群,但地图是?

回答

4

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

在某些情况下,斯卡拉斯类型类是不必要的不​​变的。但这不是其中之一。由于|+|函数的签名,方差(无论是co-还是contra-)都没有多大意义,因此typeclass的最大通用性是正确的。

相关问题