2010-08-26 8 views
9

D ha 'newtype' (come in Haskell).D ha 'newtype'?

È una domanda ingenua, dato che sto sfiorando D, ma Google non ha rivelato nulla di utile.

In Haskell questo è un modo di rendere diversi tipi della stessa cosa distinti al momento della compilazione, ma senza incorrere in alcuna penalità prestazionale di esecuzione.

ad es. potresti creare nuovi tipi (doppi) per metri, secondi e chilogrammi. Questo sarebbe un errore in fase di compilazione se il tuo programma aggiungesse una quantità in metri a una quantità in secondi, ma sarebbe altrettanto veloce in fase di esecuzione come se entrambi fossero doppi (che sono in fase di runtime).

Se D non ha qualcosa di analogo a "newtype", quali sono i metodi accettati per gestire le quantità dimensionate?

Grazie,

Chris.

+0

Una classe di involucro sottile con sovraccarico dell'operatore approriata potrebbe portare a termine il lavoro e ottimizzare. Ma questa è solo una supposizione e una soluzione piuttosto brutta. – delnan

+1

@delnan: In D probabilmente useresti una struct, non una classe. – dsimcha

+0

Per un momento ho pensato: "newtype? .... come in Gundam ????" XD – Klaim

risposta

12

In D1.0 c'è typedef, che è la forte tipizzazione da un tipo predefinito a un 'newtype.'

D2.0 ha rimosso questo e rimane solo l'alias (che typedef è in C). Si parla di avere un template wrapper in grado di creare fortemente un nuovo tipo.

Il problema con typedef era che c'erano buoni argomenti per rendere il newtype un sottotipo del tipo predefinito, e anche buoni argomenti per renderlo un super-tipo.

La semantica di typedef è che il tipo di base viene convertito implicitamente nel newtype, ma il newtype non viene convertito nel tipo di base o in altri tipi con lo stesso tipo di base. Sto usando il tipo di base qui:

typedef int Fish; 
typedef Fish Cat; 
Fish gold = 1; 
Cat fluff = gold; 

Non verrà compilato.

E sin da ora 2.048 DMD consente ancora l'uso di typedef (ma non usarlo).

Avere il tipo di base convertire il newtype è utile in modo da non dover scrivere

meters = cast(meters) 12.7; 
+1

In 'typedef X Y', se' X' è implicitamente convertibile in o da 'Y', quindi' typedef' non è molto simile a 'newtype' di Haskell'. –

+0

@Read Barton, ho accettato questa risposta come una risposta di "no non è così". – fadedbee

+0

@he_the_great, quali sono gli argomenti a favore del nuovo tipo essendo un supertipo? Potremmo avere sia subtypedef che supertypedef nella lingua? – fadedbee

6

divertente, come he_the_great menzioni, D1 ha avuto un forte typedef ma nessuno ha usato, forse perché era impossibile per personalizzare la semantica esatta per ogni caso. Forse il modo più semplice per gestire questa situazione, almeno per i tipi primitivi, è quello di includere un modello di mixin da qualche parte in Phobos che ti permetta di inoltrare tutti gli operatori, ma di farlo generare automaticamente tramite il mixin. Quindi devi solo creare una struttura wrapper ed essere tutto pronto.