Make =:=可交换?

时间:2015-08-03 15:41:29

标签: scala type-systems

=:=应该是可交换的:A =:= B暗示B =:= A。我想知道是否有办法让scala理解这一点。详细说明,如果我使用

implicit def typeEqCommutes[A,B](ev: A=:=B): B=:=A = ev.asInstanceOf[B=:=A]
提供scala,那么就有办法the following would compile:

    class Pair[T, S](var first: T, var second: S) {
    def swap(implicit ev: T =:= S) {
      val temp = first
      first = second //error: type mismatch; found: S required: T

      second = temp
    }
  }

1 个答案:

答案 0 :(得分:0)

嗯,它可能不完全是你所要求的,但你可以尝试更明确地暗示:

class Pair[T, S](var first: T, var second: S) {
  def swap(implicit ev: T =:= S, commutative: S =:= T) {
    val temp = first
    first = commutative(second)

    second = ev(temp)
  }
}
找到S =:= T的证据不应该是编译器的问题,因为=:=证明的类型相同性确实应该是可交换的。

如果你想用隐式转换来做,你必须这样做:

implicit def commutativity[A, B](in: B)(implicit ev: A =:= B): A = {
  in.asInstanceOf[A]
}

class Pair[T, S](var first: T, var second: S) {
  def swap(implicit ev: T =:= S) {
    val temp = first
    first = second

    second = ev(temp)
  }
}

虽然,imho,不需要使用asInstanceOf总是更好。