2016-03-01 9 views
5

私はジュリアを探検しているので、初心者です。今私は強く型付けされた機能を探求しています。私が認識していることは、配列の抽象型の使用法がわかりません。例を挙げて説明しましょう:ジュリアの抽象型の配列の使用

具体的な型にかかわらず、実数の配列を受け入れる関数を作成したいとしましょう。私が使用します。

function f(x::Array{Real}) 
    # do something 
end 

この関数は、私がいる限り要素の型が実であるようf([1,2,3])またはf([1.,2.,3.])を呼び出すしたいと思いますf has no method matching f(::Array{Float64,1})

を上げずに呼び出されることはありませんすることができます。

私はあなたが配列(p.eg f(convert(Array{Real}, [1, 2, 3]))程度かそれ以上)を宣伝したり変換したりすることができると読んだことがありますが、それは本当にダイナミックで退屈なものです。

強く型付けされた動作を取り除くのではなく、他の方法がありますか?

ありがとうございました。

+5

パラメトリック関数を定義することができます: 'function f {T <:Real}(x :: Array {T})'。これは 'f([1,2,3])'と 'f([1.、2.、3.。])'の両方を捕捉します。 –

+0

@ user3580870にコメントを追加するだけで、パラメトリック関数に関連するパフォーマンスペナルティはありません。それはジュリアの絶対に不可欠な機能です。 –

+0

はい、あなたのコメントのおかげで、あなたは正しいです。私はこの代替案を "退屈な代替案"として追加しようとしていましたが、ついにそれを後悔しました。このソリューションは、匿名の関数に使用することができないため、私を満足させるものではありません。 – TheSorcerer

答えて

7

あなたはまた、関数定義はもう少し簡潔にするためにtypealiasを使用することができ、@user3580870によって解に展開するには:

typealias RealArray{T<:Real} Array{T} 
f(x::RealArray) = "do something with $x" 

そしてあなたも、無名関数でtypealiasを使用することができます。

g = (x::RealArray) -> "something else with $x" 
+0

私にとって間違いなく最高のソリューションです。ありがとう:) – TheSorcerer

関連する問題