2010-08-26 29 views
9

Est-ce que D a 'newtype' (comme dans Haskell).Est-ce que D a 'newtype'?

C'est une question naïve, car je ne fais que passer par-dessus D, mais Google n'a rien trouvé d'utile. Dans Haskell, il s'agit d'une manière de distinguer différents types de la même chose au moment de la compilation, mais sans encourir de pénalités de performance à l'exécution.

par exemple. vous pourriez faire de nouveaux types (doubles) pour les mètres, les secondes et les kilogrammes. Cela causerait une erreur au moment de la compilation si votre programme ajoutait une quantité en mètres à une quantité en secondes, mais serait aussi rapide à l'exécution que si les deux étaient des doubles (ce qui est le cas lors de l'exécution).

Si D n'a rien d'analogue à 'newtype', quelles sont les méthodes acceptées pour traiter les grandeurs dimensionnées?

Merci,

Chris.

+0

Une classe d'emballage mince avec des surcharges de l'opérateur approriate pourrait faire le travail et être optimisée. Mais c'est juste une supposition et une solution assez laide. – delnan

+1

@delnan: En D, vous utiliseriez probablement une structure, pas une classe. – dsimcha

+0

Pendant un moment, j'ai pensé: "newtype? .... comme dans Gundam ????" XD – Klaim

Répondre

12

Dans D1.0, il y a typedef, qui est le typage fort d'un type prédéfini à un 'newtype'. D2.0 a enlevé ceci et seul l'alias reste (quel typedef est en C). On parle d'avoir un modèle de wrapper qui peut fortement créer un nouveau type. Le problème avec typedef était qu'il y avait de bons arguments pour faire du nouveau type un sous-type du type prédéfini, et aussi de bons arguments pour en faire un super-type. La sémantique de typedef est que le type de base est implicitement converti en newtype, mais le type nouveau n'est pas converti en type de base ou d'autres types avec le même type de base. J'utilise le type de base ici puisque:

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

Échoue à la compilation.

Et dès maintenant, 2.048 DMD permet toujours l'utilisation de typedef (mais ne l'utilise pas).

Avoir le type de base se convertir à l'newtype est utile si vous n'avez pas à écrire

meters = cast(meters) 12.7; 
+1

Dans 'typedef X Y', si' X' est implicitement convertible vers ou à partir de 'Y', alors' typedef' ne ressemble pas beaucoup à 'newtype' de Haskell. –

+0

@Read Barton, j'ai accepté cette réponse comme une réponse de "non ça ne l'est pas". – fadedbee

+0

@the_the_great, quels sont les arguments en faveur du nouveau type étant un supertype? Pourrions-nous avoir à la fois subtypedef et supertypedef dans la langue? – fadedbee

6

drôle, comme he_the_great mentionne, D1 avait une forte typedef mais Noone utilisé, peut-être parce qu'il était impossible pour personnaliser la sémantique exacte pour chaque cas. La manière la plus simple de gérer cette situation, au moins pour les types primitifs, est d'inclure un template mixin quelque part dans Phobos qui vous permet de transférer tous les opérateurs mais qui ont le standard pour le faire automatiquement via le mixin. Ensuite, vous devez simplement créer une structure wrapper et être tout ensemble.