2016-03-01 109 views
5

我在探索Julia,所以我是一個新手。現在我正在探索它的強類型功能。我所意識到的是我看不到數組的抽象類型的用法。讓我用一個例子來解釋一下:Julia抽象類型數組的使用

假設我想創建一個接受reals數組的函數,不管它的具體類型如何。我會用:

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

此功能可從來沒有所謂不養f has no method matching f(::Array{Float64,1})

我想打電話給f([1,2,3])f([1.,2.,3.])只要元素的類型是真實的。

我讀過,你可以提升或轉換數組(p.eg f(convert(Array{Real}, [1, 2, 3]))左右),但我看到這種方式真的非動態和乏味。

有沒有其他的選擇,而不是擺脫強類型的行爲?

謝謝。

+5

您可以定義一個參數函數:函數f {T <:Real}(x :: Array {T})'。這將捕獲'f([1,2,3])'和'f([1.,2,3。])''。 –

+0

只需添加@ user3580870評論:與參數功能相關的性能不會受到影響。這是Julia絕對不可缺少的特徵。 –

+0

是的,謝謝你的評論,你是對的。我正要添加這個替代品作爲一個「乏味的替代品」,但我終於後悔了。這個解決方案不能滿足我,因爲它不能用於匿名函數。 – TheSorcerer

回答

7

要通過@user3580870在解決擴大,您還可以使用typealias使函數定義有點更簡潔:

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

然後你就可以在匿名函數使用typealias,太:

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

絕對是我的最佳解決方案。謝謝 :) – TheSorcerer