このジュリアの関数定義が、以下に示す私の使用方法と一致しない理由を理解できますか?ジュリアマルチプルディスパッチでサブタイプが一致しない
私の前提は、関数に渡されるArray{ASCIIString,1}
は、関数定義Array{AbstractString,1}
と一致しなければならないということです。
julia> function test(a::Array{AbstractString,1}, b::AbstractString, c::Any) end
test (generic function with 1 method)
julia> test([""],"","")
ERROR: MethodError: `test` has no method matching test(::Array{ASCIIString,1}, ::ASCIIString, ::ASCIIString)
Closest candidates are:
test(::Array{AbstractString,1}, ::AbstractString, ::Any)
julia>
理由は、ジュリア・タイプが不変*であるということです* issubtype(配列{ASCIIStringが、1}、配列{AbstractStringが、1}) '偽である'を意味しています。詳細については、http://docs.julialang.org/en/release-0.4/manual/types/#man-parametric-typesを参照してください。 –
これは、[この質問](http://stackoverflow.com/questions/34688923/julia-parametric-function-for-array-of-array-with-multiple-dispatch)における問題の簡単な例です。しかし、問題のプレゼンテーションは私が投票したままにしておきます。簡単な参照のために必要な構文は 'function test {T <:AbstractString}(:: Array {T}、b :: T、c :: Any)'です。要素の型が 'b'の型と異なるようにするために... –
これまでのコメントでは、「第2型のパラメータ」についてのナンセンスを無視しています。要素の型が 'a'で、型が' b'と異なるようにするには、 'function test {T <:AbstractString}(:: Array {T}、b :: AbstractString、c :: Any)'が十分。キーポイントは、 'ASCIIString <:AbstractString'は' true'ですが、 'Array {ASCIIString、1} <:Array {AbstractString、1}'は 'false'です。 –