2011-08-17 12 views
10

Il seguente codice non viene compilato.Propagazione argomenti opzionali

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

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

presumo questo è perché deve essere fornito un esempio del tipo sottostante dell'opzione, e il compilatore maniglie passa Some/None base di sintassi.

Supponendo che la mia ipotesi sia stata correttamente ipotizzata, esiste una soluzione alternativa? È possibile propagare argomenti opzionali?

risposta

21

F # spec 8.13.5 argomenti opzionali per i membri di metodo

chiamanti possono specificare i valori per gli argomenti opzionali utilizzando le seguenti tecniche:

  • Per nome , ad esempio arg2 = 1.
  • Propagando un valore opzionale esistente per nome, ad esempio? arg2 = None o? arg2 = Some (3) o? arg2 = arg2. Questo può essere utile quando si costruisce un metodo che passa argomenti opzionali a un altro.
  • Utilizzando argomenti normali, senza nome, corrispondenti alla posizione.

    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

Ok. Hai letto troppo delle specifiche. :-) Perché funziona? – Daniel

+0

Nevermind. L'ho trovato nello spec. Ho _ veramente _ avuto modo di leggerlo un po 'di tempo. – Daniel

+0

grazie ... a volte la sintassi è semplicissima;) – Carsten

1

Scusate abbiamo dovuto testarlo prima: sembra che tu abbia ragione - devi fare il "?" per A te:

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

Questo è praticabile. Grazie. Aspetterò e vedrò se qualcuno può suggerire come farlo funzionare pur mantenendo gli argomenti opzionali su 'A'. – Daniel

+0

In secondo luogo, questo significa che gli argomenti facoltativi non possono essere propagati. Non è possibile avere un metodo o una classe derivata con lo stesso argomento facoltativo passato al costruttore - un po 'limitante. Richiederebbe la ramificazione al sovraccarico corretto del costruttore ogni volta. – Daniel

+0

potrebbe essere un bug - all'interno del tipo arg (con?) È l'opzione stringa, ma nella definizione di nuovo è stringa - forse dovremmo archiviare un caso? – Carsten