2012-05-23 12 views
10

Se ho una classe C# con la conversione implicita di raddoppiare, in questo modo:Esiste comunque l'uso di operatori impliciti in C# da F #?

public class Parameter 
{ 
    private double _value; 
    public Parameter(double value) { _value = value } 
    public static implicit operator double(Parameter p) { return _value; } 
} 

F # non piace me cercando di usarlo come se fosse un float:

let a = Parameter(4.0) 
let b = Parameter(2.0) 
let c = a * Math.Sin(b) <-- 'expected float, here Parameter' 

C'è qualsiasi modo per farlo (suppongo che non ci sia, basato su this question/answer), e se no, quale sarebbe una soluzione decente?

+0

Pensa: Posso aggiungere una proprietà 'Value' e usarla ovunque, non è bella, ma meno brutta che qualsiasi altra cosa possa pensare ... – Benjol

+1

Purtroppo non ... http: //stackoverflow.com/questions/1686895/is-there-an-equivalent-to-creation-ac-sharp-implicito-operator-in-f –

risposta

17

F # non esegue conversioni implicite, ma permette di definire un operatore esplicito per eseguirli. Vedere la kvb's answer to a previous question:

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

Questo sta usando statically resolved type parameters dire che sia l'ingresso o il risultato deve fornire operatore di conversione implicita - questi vengono compilati a metodi chiamati op_Implicit, così gli F controlli # compilatore per un metodo statico con questo nome speciale

Utilizzando l'operatore !>, è ora possibile in modo esplicito dire dove si desidera convertire Parameter ad un float (due volte) nel codice di esempio in questo modo:

let a = Parameter(4.0) 
let b = Parameter(2.0) 
let c = !> a * Math.Sin(!> b) 

Credo che la ragione principale per non aver permesso implicita le conversioni in F # sono che renderebbe l'inferenza di tipo un po 'più difficile e sarebbe difficile per il compilatore dare buoni messaggi di errore.

+1

Hm, non riesco a decidere quale sia più brutto di 'A.Value * Math.Exp (time.Value) * Math.Sin (B.Value * time.Value)' e '!> A * Math.Exp (|> tempo) * Math.Sin (!> B *!> tempo) ' – Benjol

+0

@ Benjol Sono pienamente d'accordo - In effetti, sono abbastanza convinto che l'uso dell'operatore'!> 'è più brutto che usare la proprietà' .Value', quindi probabilmente lo userò. L'operatore '!>' È probabilmente utile solo se hai bisogno di scrivere altre funzioni generiche. –

Problemi correlati