是无形的'型不平等车吗?

时间:2017-01-05 17:44:53

标签: scala shapeless

一旦类型参数进入图片,无形状中的类型不等式似乎不安全。

例如,以下代码编译

def someMethod[T](in : T) = {

  implicitly[T =:!= String]

  // some operation that requires T not String could be called here
  // even though there is no guarantee that this is safe
}

val a = someMethod("abc") // here we have just proven String != String

我的直觉是正确的行为应该是编译时错误(我们已经生成了String =!:= String

的证据

这与=:!=运算符无关,但与使用隐式冲突模拟否定运算符的所有情况无关。

这真的是一个错误还是我错过了一个重点?

2 个答案:

答案 0 :(得分:2)

这是一个错误,或者至多是一个令人惊讶的错误。

答案 1 :(得分:1)

T =:!= String需要是someMethod的隐含参数。我们需要在呼叫网站上收集T不是String的证据,否则为时已​​晚。 T内的someMethod被删除。

def someMethod[T](in : T)(implicit ev: T =:!= String) = {
  println("Definitely not a string")
}

scala> someMethod("abc")
<console>:16: error: ambiguous implicit values:
 both method neqAmbig1 in package shapeless of type [A]=> shapeless.=:!=[A,A]
 and method neqAmbig2 in package shapeless of type [A]=> shapeless.=:!=[A,A]
 match expected type shapeless.=:!=[String,String]
       someMethod("abc")
                 ^