El mejor mecanismo que conozco para realizar La aritmética genérica es clases de tipos, que lamentablemente ni C#, F #, ni el tiempo de ejecución .Net son compatibles en general. Sin embargo, se les puede simular a sí mismo con la mano, como se menciona en esta entrada del blog:
Type Classes Are The Secret Sauce
Esta técnica debería funcionar en C# 2.0 o posterior (usando el anonimato delegados/lambdas).
A menudo, las personas recurren a las interfaces, pero correr en un par de problemas
- no se puede declarar que el tipo existente implementar una interfaz, por lo que no se puede definir instancia de esa interfaz para construida en tipos como int .
- Las interfaces no pueden restringir el tipo de otros argumentos a los métodos.
Una interfaz declara que, para todas las implementaciones, todos los métodos en esa interfaz toman el mismo tipo de parámetro "este" implícito. Si Foo implementa alguna interfaz, entonces obviamente el parámetro 'this' debe ser de tipo Foo para esa implementación. Pero no hay forma de exigir que los otros parámetros del método también sean del tipo Foo.
Type classes le permiten (entre otras cosas) realizar este tipo de restricción en todos los parámetros del método, no solo en el primer parámetro.
Como se menciona en el artículo citado anteriormente, puede simular clases de tipos pasando tablas de funciones como argumentos explícitos.
(Comunidad wiki: registraría un ejemplo de ese artículo traducido en C# aquí, pero se acabó el tiempo con explicación de largo aliento)
Pensé que necesita usar '^ a' en lugar de''a' cuando usa restricciones estáticas en F #, pero puedo estar equivocado ... –
Ambos funcionan en este caso. – gradbot
En este caso particular, ni siquiera necesita especificar los parámetros genéricos o restricciones porque se pueden inferir: 'let inline sum a b = a + b' – kvb