2010-08-17 10 views
10

sto cercando di definire operatore con i parametri di tipo esplicito e vincoli:F #: parametri di tipo esplicite in operatore vincolante

let inline (===)<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

Funziona bene in F # 2.0, ma produce il:

avviso FS1189:
I parametri di tipo devono essere inseriti direttamente su adiacenti al nome del tipo, ad es. "Tipo C < 'T>", non di tipo "C <' T>"

Allora, qual è il modo giusto di fare esplicita specificazione argomenti di tipo per la definizione dell'operatore?

p.s. Per favore non parlarmi di parametri di tipo implicito e di altri metodi alternativi, voglio risolvere concretamente questo problema.

risposta

12

Un errore nel compilatore indica che gli operatori simbolici non vengono mai considerati direttamente adiacenti ai parametri di tipo. Puoi risolvere il problema tramite ad es.

let inline myeq<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

let inline (===) a b = myeq a b 
+1

modelli Anche attivi hanno lo stesso problema: 'diamo (| SomePatternName |) <'a, 'b> x = x' – ControlFlow

4
let inline (===) (a : 'TA when 'TA : not struct) (b : 'TB when 'TB : not struct) = 
    obj.ReferenceEquals (a,b) 
+0

bene, ma questo non è parametri di tipo esplicite;) – ControlFlow