2017-01-05 6 views
3

型不等式の型不等式は、型パラメータが画像に入ると安全ではないようです。シェイプレスタイプ不平等バグ?

は、たとえば次のコードでは、これが=:!=に関連していない

(私たちはString =!:= Stringという証拠を生成した)

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 

私の直感は正しい動作がコンパイル時エラーがでなければならないことであるコンパイル暗黙の競合が否定演算子をエミュレートするために使用されるすべての状況に適用されます。

これは本当にバグですか、それとも重要な点がありませんか?

+0

シェイプレス問題トラッカーでこれを忘れないように問題を作成してもよろしいですか? –

答えて

1

T =:!= Stringは、someMethodの暗黙の引数である必要があります。私たちはTがコールサイトでStringではないという証拠を収集する必要があります。それ以外の場合は遅すぎます。 someMethodの本文内でTが消去されます。

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") 
       ^
+1

あなたは正しいですが、彼はポイントを持っています... –

+0

私はあなたの言うことを理解していますが、問題はアプリの側面にコードを書く人が確率1の暗黙のことを忘れる傾向があるということです。私の例がなぜコンパイルされるのか理解していますか?あなたは消しゴムが役割を果たすと言いますが、コンパイラが私の例で暗黙的に生成することを許可している理由は分かりません。 'F'を消去すると、ある時点で効果的に' Any'に変えられますか? – luca

+0

@luca問題は、このトリックは、別の暗黙的なものが見つからないという暗黙の証拠を提供することによって機能することです。他の場合で無限のT <:について何かを証明しようとすると、コンパイラは暗黙の証拠を見つけることができないと不満を持ちます。しかし、この場合、T =:=文字列(彼はTについて何も知らないので)という証拠が見つからないという事実は、T =については何も知られていないにもかかわらず、T =:!= –

2

これはバグでも、最高でも驚くほどの誤った機能です。