2016-03-01 14 views
5

Odkrywam Julię, więc jestem początkującą. Teraz badam jego silnie typowane funkcje. Rozumiem, że nie widzę użycia abstrakcyjnych typów tablic. Pozwól mi wyjaśnić na przykładzie:Użycie Tablicy abstrakcyjnych typów w Julii

Załóżmy, że chciałbym utworzyć funkcję, która akceptuje tablice rzeczywistych, bez względu na jej konkretny typ. użyłbym:

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

Ta funkcja może nie być wywołana bez podnosząc f has no method matching f(::Array{Float64,1})

Chciałbym zadzwonić f([1,2,3]) lub f([1.,2.,3.]) tak długo, jak typ elementu jest prawdziwy.

Przeczytałem, że można promować lub konwertować macierz (np.

Czy jest jakaś inna alternatywa zamiast pozbycia się mocno wpisanego zachowania?

Dzięki.

+5

Możesz zdefiniować funkcję parametryczną: 'function f {T <: Real} (x :: Array {T})'. To przechwyciłoby zarówno 'f ([1,2,3])' i 'f ([1., 2., 3.])'. –

+0

Po prostu dodanie do komentarza @ user3580870: nie ma kary za wydajność związanej z funkcjami parametrycznymi. Jest to absolutnie integralna cecha Julii. –

+0

Tak, dzięki za komentarz, masz rację. Miałem zamiar dodać tę alternatywę jako "żmudną alternatywę", ale w końcu tego żałowałem. To rozwiązanie mnie nie satysfakcjonuje, ponieważ nie można go używać do anonimowych funkcji. – TheSorcerer

Odpowiedz

7

Aby rozwinąć na rozwiązanie przez @user3580870, można również użyć typealias aby definicję funkcji nieco bardziej zwięzły:

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

a następnie można użyć typealias w funkcjach anonimowych też:

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

Zdecydowanie dla mnie to najlepsze rozwiązanie. Dzięki :) – TheSorcerer