2012-05-23 19 views
10

Si tengo una clase C# con la conversión implícita para doblar, así:¿Hay alguna forma de usar operadores implícitos C# de F #?

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

F # no me quiere tratar de usarlo como si fuera un float:

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

¿Hay cualquier forma de hacer esto (supongo que no, basado en this question/answer), y si no, ¿cuál sería una solución decente?

+0

Pienso: puedo agregar una propiedad de 'Valor' y usar eso en todas partes, no es hermoso, pero menos feo que cualquier otra cosa que pueda pensar ... – Benjol

+1

Lamentablemente no ... http: //stackoverflow.com/questions/1686895/is-there-an-equivalent-to-creating-ac-sharp-implicit-operator-in-f –

Respuesta

17

F # no realiza conversiones implícitas, pero le permite definir un operador explícita para ejecutarlas. Ver el kvb's answer to a previous question:

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

Esto es usando statically resolved type parameters decir que la entrada o el resultado debe proveer el operador de conversión implícita - estos son compilados a métodos denominados op_Implicit, por lo que los F cheques # compilador para un método estático con este nombre especial.

Usando el operador !>, ahora se puede decir de manera explícita en la que desea convertir Parameter a un float (dos veces) en su muestra de código como este:

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

Creo que la razón principal para no permitir implícita conversiones en F # es que haría la inferencia de tipo un poco más difícil y sería difícil para el compilador dar buenos mensajes de error.

+1

Hm, no puedo decidir cuál es más feo fuera de 'A.Value * Math.Exp (time.Value) * Math.Sin (B.Value * time.Value)' y '!> A * Math.Exp (|> tiempo) * Math.Sin (!> B *!> time) ' – Benjol

+0

@Benjol Estoy totalmente de acuerdo - De hecho, estoy bastante convencido de que usar el operador'!> 'es más feo que usar la propiedad' .Value', así que probablemente solo use eso. El operador '!>' Probablemente solo sea útil si necesita escribir otras funciones genéricas. –

Cuestiones relacionadas