Selectively disable subsumption in Scala? (correctly type List.contains)

前端 未结 6 1803
北荒
北荒 2020-12-16 11:04
List(\"a\").contains(5)

Because an Int can never be contained in a list of String

6条回答
  •  时光取名叫无心
    2020-12-16 11:49

    Why not use an equality typeclass?

    scala> val l = List(1,2,3)
    l: List[Int] = List(1, 2, 3)
    
    scala> class EQ[A](a1:A) { def ===(a2:A) = a1 == a2 } 
    defined class EQ
    
    scala> implicit def toEQ[A](a1:A) = new EQ(a1)
    toEQ: [A](a1: A)EQ[A]
    
    scala> l exists (1===)
    res7: Boolean = true
    
    scala> l exists ("1"===)
    :14: error: type mismatch;
     found   : java.lang.String => Boolean
     required: Int => Boolean
                  l exists ("1"===)
                               ^
    
    scala> List("1","2")
    res9: List[java.lang.String] = List(1, 2)
    
    scala> res9 exists (1===)
    :14: error: type mismatch;
     found   : Int => Boolean
     required: java.lang.String => Boolean
                  res9 exists (1===)
    

提交回复
热议问题