2016-05-21 7 views
2

このジュリアの関数定義が、以下に示す私の使用方法と一致しない理由を理解できますか?ジュリアマルチプルディスパッチでサブタイプが一致しない

私の前提は、関数に渡される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> 
+1

理由は、ジュリア・タイプが不変*であるということです* issubtype(配列{ASCIIStringが、1}、配列{AbstractStringが、1}) '偽である'を意味しています。詳細については、http://docs.julialang.org/en/release-0.4/manual/types/#man-parametric-typesを参照してください。 –

+1

これは、[この質問](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'の型と異なるようにするために... –

+1

これまでのコメントでは、「第2型のパラメータ」についてのナンセンスを無視しています。要素の型が 'a'で、型が' b'と異なるようにするには、 'function test {T <:AbstractString}(:: Array {T}、b :: AbstractString、c :: Any)'が十分。キーポイントは、 'ASCIIString <:AbstractString'は' true'ですが、 'Array {ASCIIString、1} <:Array {AbstractString、1}'は 'false'です。 –

答えて

4

上記の2つのコメントを回答にする価値はあると思います。

@DanGetzが示すように、ここで重要なフレーズは、不変です。この特定の場合、この原理は、ASCIIString <: AbstractStringtrueと評価されることを意味するが、Array{ASCIIString, 1} <: Array{AbstractString, 1}は、falseと評価される。だからあなたの質問で働くように定義された関数の場合、配列aeltype(a)とし、AbstractStringと評価する必要があります。 aeltype(a)とするとASCIIStringと評価されますが、これはサブタイプがではないためです。

問題を解決するには、パラメータを入力する必要があります。

function test{T<:AbstractString}(a::Array{T}, b::T, c::Any) 

をあなたはbのタイプはeltype(a)異なるが、あることをbを強制できるようにする場合:あなただけbマッチeltype(a)のタイプは、あなたが使用する場合の関数を定義したい場合AbstractStringのサブタイプは、あなたが使用します。

function test{T<:AbstractString}(a::Array{T}, b::AbstractString, c::Any) 
+0

完璧に説明していただきありがとうございます! 'eltype(...)'は、コレクションの型を返します。例えば、 'eltype(Array {ASCIIString、1})#戻り値:ASCIIString '。 http://stackoverflow.com/questions/20991220/extracting-parameter-types-in-julia助けるために喜ん –

+0

@DavidParksを:また、私は関連この記事で親切読み取りを発見しました! –