2010-09-09 9 views
5

j'ai besoin de mettre en œuvre une méthode d'extension statique supportant les contraintes membres sur certains types primitifs de base comme les entiers, flottants, etc. Voici mon code pour des entiers signés:méthodes d'extension statique supportant les contraintes membres

module MyOperators = 
    let inline foo (x : ^T) = (^T : (static member Foo : ^T -> int) (x)) 

    type System.Int32 with 
     static member Foo(x : Int32) = 7 // static extension 

Code d'essai:

open MyOperators  
let x = foo 5 // x should be 7 

Mais compilateur se plaint avec l'erreur:

The type 'System.Int32' does not support any operators named 'Foo'

W Quel est le chapeau qui me manque ici? Merci!

+0

Si je vous comprends bien, je pense que même si vous pouvez le faire, ce n'est pas une très bonne idée. Bricoler avec les mécanismes du langage de base m'a toujours frappé comme un anti-pattern. Pensez au fait que quelqu'un d'autre que vous devra peut-être travailler sur ce code à un moment donné dans le futur. Vous devrez peut-être même conserver ce code à un moment donné dans le futur lorsque vous ne l'avez pas travaillé pendant un certain temps. Des modifications aux types intrinsèques peuvent conduire à plusieurs "WTF?" des moments. –

Répondre

5

Les contraintes de membre statique dans F # ne trouvent jamais de 'méthodes d'extension', elles ne peuvent voir que des méthodes intrinsèques sur les types (et quelques cas spéciaux sont signalés dans la spécification de langage F #).

Peut-être que vous pouvez utiliser la surcharge de méthode à la place? Quel est votre but ultime?

+0

Merci. Ultime objectif était d'ajouter mon propre ensemble d'intrinsèques à FSharp.Core.Operators, tels que les fonctions trigonométriques, etc – Stringer

3

Les contraintes de type statique de F # ne fonctionnent pas avec les méthodes d'extension. Les méthodes d'extension ne peuvent pas être vérifiées statiquement au moment de la compilation, et même ainsi, vous pouvez avoir plusieurs définitions pour Int32 :: Foo (en fonction de l'espace de noms que vous avez importé).

Malheureusement, pour résoudre votre problème, vous devrez peut-être recourir à la réflexion.

+0

Ok, je vois, cela semble une bonne raison. Merci! – Stringer

+6

Je ne pense pas que ce soit techniquement infaisable - les méthodes d'extension sont vérifiées statiquement au moment de la compilation (quand vous les appelez), elles peuvent donc être également acceptées par les contraintes des membres. Il est logique que ce n'est pas pris en charge, mais il devrait être possible ... –

+0

Bon appel, mon mauvais. –