2016-03-01 13 views
5

Sto esplorando Julia quindi sono un principiante. Ora sto esplorando le sue caratteristiche fortemente tipizzate. Quello che sto realizzando è che non riesco a vedere l'uso di tipi astratti per gli array. Lasciatemi spiegare un esempio:Utilizzo della matrice di tipi astratti in Julia

Supponiamo che mi piacerebbe creare una funzione che accetta matrici di real, indipendentemente dal suo tipo concreto. Vorrei usare:

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

Questa funzione può essere mai chiamato senza alzare un f has no method matching f(::Array{Float64,1})

vorrei chiamare f([1,2,3]) o f([1.,2.,3.]) a condizione che il tipo di elemento è reale.

Ho letto che è possibile promuovere o convertire l'array (p.eg f(convert(Array{Real}, [1, 2, 3])) o giù di lì) ma vedo in questo modo davvero non dinamico e noioso.

C'è qualche altra alternativa piuttosto che eliminare il comportamento fortemente tipizzato?

Grazie.

+5

È possibile definire una funzione parametrica: 'function f {T <: Real} (x :: Array {T})'. Questo catturerebbe sia 'f ([1,2,3])' sia 'f ([1., 2., 3.])'. –

+0

Solo aggiungendo al commento @ user3580870: non ci sono penalità relative alle prestazioni associate alle funzioni parametriche. È una caratteristica assolutamente integrale di Julia. –

+0

Sì, grazie per il tuo commento, hai ragione. Stavo per aggiungere questa alternativa come "alternativa noiosa", ma alla fine me ne sono pentita. Questa soluzione non mi soddisfa perché non può essere utilizzata per funzioni anonime. – TheSorcerer

risposta

7

di estendere la soluzione @user3580870, è anche possibile utilizzare un typealias per rendere la definizione di funzione un po 'più succinta:

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

e quindi è possibile utilizzare le typealias nelle funzioni anonime, anche:

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

Definitivamente per me è la soluzione migliore. Grazie :) – TheSorcerer

Problemi correlati