ジュリア(1.2)REPLでいくつかのことを試していましたが、ディスパッチについてわからないことを思いつきました。
私は最初に私が期待した方法で機能しているこのことを試しました:
f(a::T) where {T <: Int} = "Test"
f(3)の呼び出しは、
Int <: Int == true
f( "Hello")を呼び出すと、「MethodError:no method matching」エラーが発生します。
String <: Int == false
次に、私はこのメソッドを試しましたが、なぜそれを呼び出すことがいくつかのケースで機能するのかわかりません:
f(a::T, b::U) where {T, U <: T} = "Another Test"
f(3、3)を呼び出すと(期待どおり)機能します
しかしf(3、 "Hello")も機能し、「MethodError:no method matching」をスローしません???
私はそれを考えました(TがIntになり、Uが文字列になるため)String <: Int == false
???
ここにはかなり簡単なものが欠けていると思いますが、見つかりません...これが私の質問です。なぜf(3、 "Hello")が機能しているのですか?
さらに、私はこのコードスニペット(2番目のメソッドシグネチャを再作成しようとしました)を試しましたが、期待どおりに正しく失敗しました。
Test = Tuple{T, U} where {T, U <: T}
Test{Int, String}
(これは、「TypeError:タイプで、Uで、予期されたU <:Int64、タイプ{文字列}を取得した」で期待どおりに失敗します)
Int64,String,false
。関数にメソッドを追加する場合、Juliaを再起動する必要があるかもしれません。新しい文字を使用するだけで、たとえばh
新しいテストに使用できます。あなたの質問に:システムを見つけようとすることが表示されます任意のタイプの制限に対する解決策を、そしてT=Any, U=Any where U:<T
一つです。3番目の例のように具象型を導入すると、期待どおりに機能します。より正確なジュリア型システムの知識を持つ人々は、これに対してすぐに適切な答えを出すでしょう。