2010-09-09 11 views
5

ho bisogno di implementare un metodo di estensione statica di supporto vincoli membri su alcuni tipi primitivi di base come numeri interi, galleggianti, ecc Ecco il mio codice per gli interi firmati:metodi statici di estensione che supportano vincoli membri

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 

Codice di prova:

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

Ma compilatore si lamenta con l'errore:

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

W cappello mi manchi qui? Grazie!

+0

Se sto capendo correttamente, penserei che anche se è possibile farlo, non è un'idea particolarmente buona. Armeggiare con meccanismi linguistici di base mi ha sempre colpito come anti-modello. Pensa al fatto che qualcuno oltre a te potrebbe dover lavorare su questo codice in futuro. Potresti anche dover mantenere questo codice da solo in un momento futuro in cui non ci hai lavorato per un po '. Le modifiche a tipi intrinseci possono portare a diversi "WTF?" momenti. –

risposta

5

I vincoli dei membri statici in F # non trovano mai 'metodi di estensione', possono solo vedere i metodi intrinseci sui tipi (e alcuni casi speciali richiamati nelle specifiche del linguaggio F #).

Forse è possibile utilizzare l'overloading del metodo? Qual è il tuo obiettivo finale?

+0

Grazie. L'obiettivo finale era quello di aggiungere il mio set di elementi intrinseci a FSharp.Core.Operators, come le funzioni trigonometriche, ecc. – Stringer

3

I vincoli di tipo statico di F # non funzionano con i metodi di estensione. I metodi di estensione non possono essere controllati staticamente in fase di compilazione, e anche così, puoi avere più definizioni per Int32 :: Foo (a seconda di quale spazio dei nomi hai importato).

Sfortunatamente, per risolvere il problema potrebbe essere necessario ricorrere all'utilizzo del riflesso.

+0

Ok, vedo che sembra una buona ragione. Grazie! – Stringer

+6

Non penso che ciò sia tecnicamente impossibile - i metodi di estensione vengono controllati staticamente al momento della compilazione (quando li chiami), in modo che possano essere accettati anche dai vincoli dei membri. Ha senso che questo non è supportato, ma dovrebbe essere possibile ... –

+0

Buona chiamata, mio ​​male. –