2015-01-09 6 views
6

Julias parametrische Typen definieren wirklich eine Familie von Typen mit unterschiedlichem Layout im Speicher. Ich frage mich, ob dies auch für die Namen und die Anzahl der Felder in einem zusammengesetzten Typ funktioniert? Ein einfaches Beispiel wäre so etwas wie:Kann ich Typdefinitionen in Julia spezialisieren?

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

type mytype{Int64} 
    a::Int64 
end 

Das ist mir für eine Neudefinition mytype einen Fehler gibt.

Hier möchte ich zwei Felder haben, wenn mytype 's Typ Parameter war Float64 und nur eine, wenn seine Int64. (Eigentlich ist das, was ich will, komplizierter, aber das ist ein einfaches Beispiel). Man könnte sich vorstellen, abstrakte Typen und <:, etc. in den oben genannten zu haben.

Ich weiß, dass dies in anderen Sprachen vielleicht nicht möglich ist, aber für mich scheint es, dass der Compiler in der Lage sein sollte, dies herauszufinden, genauso wie Funktionen spezialisiert werden können. Schließlich wird realer (kompilierter) Code konkrete Typen beinhalten und alles wird dem Compiler bekannt sein. (Für wirklich dynamische Typen wäre in diesem Fall vielleicht eine zusätzliche Verkapselungsschicht erforderlich?)

Vielleicht gibt es einen anderen/besseren Weg, um ähnliche Ergebnisse zu erzielen?

Antwort

4

Sie können die zwei Typen getrennt definieren (mytypeF & mytypeI) und einen neuen Typ mytype als die Vereinigung der beiden definieren. Dann könnten Funktionen, die wirklich statisch bestimmen könnten, welchen Typ sie erhalten haben, wie gewünscht spezialisiert sein. Aber ich bin mir nicht sicher, ob das sinnvoll ist oder was du wirklich willst.

5

Dies ist derzeit nicht möglich, aber die Funktion wurde spekulativ als "generated types" in der Ausgabe #8472 vorgeschlagen. Sebastians Antwort ist eine vernünftige Lösung, solange Sie darauf achten, dass der gruppierte mytype Konstruktor typenstabil ist. Ein vollständigeres Beispiel finden Sie unter ImmutableArrays.jl programmgesteuert definiert eine Gruppe von Typen um den abstrakten ImmutableArray-Locus.

Verwandte Themen