2011-08-17 17 views
10

El siguiente código no se compila.Propagating argumentos opcionales

type A(?arg) = 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) //ERROR expected type string but has type 'a option 

Supongo que esto se debe a que se debe proporcionar una instancia del tipo subyacente de la opción, y el compilador mangos pasar Some/None basado en la sintaxis.

Suponiendo que mi suposición se ha asumido correctamente, ¿hay alguna solución para esto? ¿Es posible propagar argumentos opcionales?

Respuesta

21

F # spec 8.13.5 argumentos opcionales a los miembros de método

Las personas que llaman pueden especificar los valores de los argumentos opcionales mediante el uso de las siguientes técnicas:

  • Por nombre , como arg2 = 1.
  • Al propagar un valor opcional existente por nombre, como? arg2 = None o? arg2 = Some (3) o? arg2 = arg2. Esto puede ser útil cuando se construye un método que pasa argumentos opcionales a otro.
  • Al usar argumentos normales, sin nombre, coinciden con la posición.

    type A(?arg) = 
        member __.Arg : string option = arg 
    
    type B(?arg) = 
        inherit A(?arg = arg) 
    
    printfn "1. %A" (B()).Arg // None 
    printfn "2. %A" (B("1")).Arg // Some "1" 
    
    printfn "3. %A" (A()).Arg // None 
    printfn "4. %A" (A("1")).Arg // Some "1" 
    
+0

Bien. Has leído demasiado de la especificación. :-) ¿Por qué funciona esto? – Daniel

+0

No importa. Lo encontré en la especificación. De verdad, tengo que leerlo alguna vez. – Daniel

+0

gracias ... a veces la sintaxis es simplemente fácil;) – Carsten

1

Lo siento, tuve que probarlo primero: parece que tienes razón, tienes que hacer el "?" Una de sí mismo:

type A(arg : string option) = 
    new (a) = new A(Some a) 
    new() = new A(None) 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) 
+0

Eso es viable. Gracias. Voy a esperar y ver si alguien puede sugerir cómo hacerlo funcionar mientras conserva los argumentos opcionales en 'A'. – Daniel

+0

Pensándolo bien, esto significa que los argumentos opcionales no se pueden propagar. No se puede tener un método o una clase derivada con la misma arg opcional que se pasa al constructor, algo limitante. Se requeriría una bifurcación de la sobrecarga del constructor correcta todo el tiempo. – Daniel

+0

podría ser un error - dentro de la opción de tipo arg (con?) Es cadena, pero en la definición de nueva cadena, ¿deberíamos presentar un caso? – Carsten

Cuestiones relacionadas