2013-08-28 23 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的最大通用性是正確的。

相關問題