2017-10-08 12 views
0

ブランドを含むベクトル/アレイのタイプを指定します - ので、私は簡単な質問、ちょうどどこでも答えを見つけるように見えることができなかったことをお詫び:私は取る関数を作成しようとしていますはジュリアに新しい任意の数

ベクトルを引数として取りますが、ベクトルに数値(浮動小数点数または整数)が含まれていることを強制します。

私はこのように感じるのように記述する必要があります。

function foo(x::Vector{Number}) 
    return x.^2 
end 

しかしfoo([5.0])利回り

ERROR: MethodError: no method matching foo(::Array{Float64,1}) 
Closest candidates are: 
    foo(::Array{Number,1}) at REPL[16]:2 

なぜこれがあると、これを実行していますか?私はx::Vectorと言っていますが、これはうまくいきますが、私が望むタイプチェックの実施を提供していません。

+0

DNFの答えは正しいですが、それ以外の理由がない限り、 'Vector'ではなく、関数の引数型に' AbstractVector'を使うことが望ましいです。たとえば、答えのコードは 'foo(1:4)'で失敗します。 –

答えて

3

あなたが書くことができ

function foo(x::Vector{T}) where {T<:Number} 
    return x.^2 
end 

このため省略表記がある

function foo(x::Vector{<:Number}) 
    return x.^2 
end 

編集:Complexを禁止し、可能に@Lisoと@MichaelKBorregaard私は次のことを提案し、のコメントに基づいてAbstractVectors:

function foo(x::AbstractVector{<:Real}) 
    return x.^2 
end 

あなた本当には、あなたが行うことができ、フロートとint型を許可する場合:

function foo(x::AbstractVector{<:Union{AbstractFloat, Integer}}) 
    return x.^2 
end 

あなたはあなたが好きなようにほとんどのように、特定または一般として取得することができます。

+1

OPが浮動小数点数と整数だけをサポートしたいのであれば(例えば 'Complex'ではなく)、' Number'を 'Real' – Liso

関連する問題