Chiffres polymorphes sur .Net et In C #

C’est vraiment dommage qu’en .Net, il n’y ait pas de polymorphism pour les nombres, c’est-à-dire pas d’interface INumeric qui unifie les différents types de types numériques tels que bool, byte, uint, int, etc. À l’extrême, on voudrait un ensemble complet de types d’algèbre.

Joe Duffy a un article sur le problème:

http://www.bluebytesoftware.com/blog/CommentView,guid,14b37ade-3110-4596-9d6e-bacdcd75baa8.aspx

Comment l’exprimeriez-vous en C # afin de l’adapter sans avoir d’influence sur .Net ou C #?

J’ai une idée qui implique tout d’abord de définir un ou plusieurs types abstraits (interfaces telles qu’INumeric – ou plus abstraite que cela), puis de définir des structures qui implémentent ces types et des types tels que int tout en fournissant des opérations renvoyant le nouveau type (par exemple, Integer32: INumeric, où l’addition serait définie comme

public Integer32 Add(Integer32 other) { return Return(Value + other.Value); } 

J’ai un peu peur de la vitesse d’exécution de ce code, mais au moins c’est abstrait.

Pas de surcharge de l’opérateur …

D’autres idées?

.Net ne ressemble pas à une plate-forme viable à long terme s’il ne peut pas avoir ce genre d’abstraction, je pense – et être efficace à ce sujet.

L’abstraction est une réutilisation.

mettre à jour:

Voici un exemple de signature de type d’implémentation jusqu’à présent:

 public struct Integer32 : INumeric, IOrder 

Compenser le manque de types de retour covariants.

Quelqu’un a déjà essayé d’écrire quelque chose qui pourrait résoudre votre problème. Il s’appelle des opérateurs génériques et est disponible dans la bibliothèque d’utilitaires divers .

L’équipe linguistique de csharp étudie déjà la question. Si vous voulez voir l’avenir des classes de types en C #, commencez à lire à

https://github.com/dotnet/csharplang/issues/164

entrez la description de l'image ici

Il semble avoir le soutien de Mads Torgesson, donc ce n’est pas simplement un message aléatoire tiré d’un fanboy errant de Haskell.

L’exemple donné d’une classe ou d’une forme en C # est:

 public shape SGroup { static T operator +(T t1, T t2); static T Zero { get; } } 

remarquez que ce n’est pas comme une interface. C’est déclarer une méthode statique qui appartient à SGroup. Lisez la suite pour plus de détails et une discussion .

Si vous envisagez d’utiliser C # 4.0, vous pouvez facilement simuler des opérations mathématiques génériques à l’aide de dynamic . Voici un exemple de fonction d’addition simple (pour plus d’informations, voir ce blog ):

 public static T Add(T a, T b) { dynamic ad = a; dynamic bd = b; return ad + bd; } 

Je n’ai pas joué avec ça, donc je ne peux pas en dire beaucoup sur la performance. Il y aura certainement un certain prix à la performance pour l’utilisation de dynamic, mais je pense que le DLR devrait être capable d’effectuer des optimisations très efficaces si vous appelez la fonction plusieurs fois. En fait, je ne serais pas surpris si son profil de performance était similaire à celui des opérateurs génériques mentionnés ci-dessus.