2015-01-09 13 views
6

I tipi parametrici di Julia definiscono realmente una famiglia di tipi contenenti layout diversi in memoria. Mi chiedevo se questo funziona anche per i nomi e il numero di campi in un tipo composito? Un semplice esempio potrebbe essere qualcosa di simile:Posso specializzare le definizioni dei tipi in Julia?

type mytype{Float64} 
    a::Float64 
    b::Float64 
end 

type mytype{Int64} 
    a::Int64 
end 

Questo mi dà un errore per ridefinire mytype.

Qui, desidero avere due campi se il parametro di tipo mytype è Float64 e uno solo se è Int64. (In realtà ciò che voglio è più complicato, ma questo è un esempio di base). Si potrebbe immaginare di avere tipi astratti e <:, ecc. In quanto sopra.

Mi rendo conto che questo potrebbe non essere possibile in altre lingue, ma a me sembra che il compilatore dovrebbe essere in grado di capirlo allo stesso modo in cui le funzioni possono essere specializzate. Dopotutto, il codice reale (compilato) coinvolgerà tipi concreti e tutto sarà conosciuto dal compilatore. (per tipi veramente dinamici, forse sarebbe necessario un ulteriore strato di incapsulamento in questo caso?)

Forse c'è un modo diverso/migliore per ottenere risultati simili?

risposta

4

è possibile definire i due tipi separatamente (mytypeF & mytypeI) e definire un nuovo tipo mytype come l'unione dei due. Quindi le funzioni che potrebbero realmente determinare in modo statico quale tipo di persone hanno ricevuto sarebbero specializzate come richiesto. Ma non sono sicuro che sia sensato o ciò che cerchi davvero.

5

Attualmente non possibile, ma la funzione è stata proposta in modo speculativo come "tipi generati" nel numero #8472. La risposta di Sebastian è un lavoro ragionevole finché si cura che il costruttore mytype raggruppato sia di tipo stabile. Per un esempio più completo, vedere come ImmutableArrays.jl definisce a livello di programmazione un gruppo di tipi attorno al locus astratto ImmutableArray.

Problemi correlati