-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NTuple, Union, and Parametric Types #15
Comments
追記: julia> typealias MyNTuple{T<:Real,N} NTuple{N, Union{Integer, Vector{T}}}
NTuple{N,Union{Array{T<:Real,1},Integer}}
julia> function myfunction3(t::MyNTuple)
return t
end; julia> myfunction3((1, 2))
(1,2)
julia> myfunction3((1, [2]))
(1,[2])
julia> myfunction3((1, [2.]))
(1,[2.0]) 何が起きているのでしょうか. |
う〜む、私にはJuliaのバグのように思えます。 以下私が確認した事実のメモです。 以下のように型変数 julia> T = TypeVar(:T, Real, true)
T<:Real
julia> Tuple{Int,Int} <: NTuple{2,Union{Integer,Vector{T}}}
true
julia> isa((1, 1), NTuple{2,Union{Integer,Vector{T}}})
true
しかしメソッド定義にすると、以下の julia> function f{T<:Real,N}(t::NTuple{N,Union{Integer,Vector{T}}}); t; end
f (generic function with 1 method)
julia> f((1, 2))
ERROR: MethodError: `f` has no method matching f(::Tuple{Int64,Int64})
Closest candidates are:
f{T<:Real,N}(::NTuple{N,Union{Array{T<:Real,1},Integer}})
julia> function g{T<:Any,N}(t::NTuple{N,Union{Integer,Vector{T}}}); t; end
g (generic function with 1 method)
julia> g((1, 2))
ERROR: MethodError: `g` has no method matching g(::Tuple{Int64,Int64})
Closest candidates are:
g{T,N}(::NTuple{N,Union{Array{T,1},Integer}})
julia> function h{T,N}(t::NTuple{N,Union{Integer,Vector{T}}}); t; end
h (generic function with 1 method)
julia> h((1, 2))
ERROR: MethodError: `h` has no method matching h(::Tuple{Int64,Int64})
Closest candidates are:
h{T,N}(::NTuple{N,Union{Array{T,1},Integer}})
型変数 julia> function i{N}(t::NTuple{N,Union{Integer,Vector}}); t; end
i (generic function with 1 method)
julia> i((1, 2))
(1,2)
|
調べていただきありがとうございます. |
もうちょっと問題を狭めていったら、以下の様な簡単な例でもうまく動かないようでした。 function m{T}(t::Union{Int,Vector{T}})
t
end
function n(t::Union{Int,Vector})
t
end julia> m(1)
ERROR: MethodError: `m` has no method matching m(::Int64)
Closest candidates are:
m{T}(::Union{Array{T,1},Int64})
in eval at ./boot.jl:265
julia> n(1)
1
どうやら、 ですので、今のところユーザからは解決する手段はなさそうですが、一応後ほどJuliaのIssuesの方にもコメントを残しておこうと思います。 |
いろいろ調べていただきありがとうございました. |
連続で恐縮ですが,また質問です.
Int
とVector
が混ざる可能性のあるTuple
を引数に持つ関数を書きたいとします.Vector{Float64}
としたので,このままではとうぜんInteger
のVector
は受け付けてくれない.そこで
Vector
の type を parametric にしてT<:Real
にしてみます.すると
Vector{Int}
が入っていても通るようになる.しかし,今度は,さっきは通っていた
Tuple{Int, Int}
を受け付けなくなる.これはなぜなのでしょうか.
The text was updated successfully, but these errors were encountered: