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

왜 HashMaps는 Semigroup이 아니지만 Maps입니까? 객체 지향적 인 배경에서 볼 때 HashMap은 Map만큼이나 쉽게 사용할 수있을 것이라고 기대했을까요?왜 HashMaps는 Semigroup이 아니지만 Maps입니까?

답변

4

Semigroup은 변하지 않으며 특별히 HashMap에 대해 정의 된 인스턴스가 없기 때문에 단지 Map입니다. 불변량이란 이 Map의 하위 유형인데도 |+| 구문이 HashMap 인 것으로 추정되는 유형의 Map에 대해 Semigroup 인스턴스를 사용할 수 없음을 의미합니다.

스칼라즈 형 안경은 불필요하게 불변합니다. 이러한 경우는 아닙니다. |+| 함수의 서명으로 인해 분산 (공동 또는 대조)은별로 의미가 없으므로 typeclass는 최대한의 일반성에서 정확합니다.

관련 문제