2010-04-24 5 views

risposta

27

Usa unità per effetto collaterale vuota:

match list with 
    | [] -> printfn "Empty!" 
    | _ ->() 
+2

Dove "()" è il valore di tipo "unità", e "unità" è il tipo di ritorno di "printfn", in qualche modo simile a "void". – Brian

+0

Perfetto, grazie! –

+0

Posso usarlo per il ciclo Empty While? – fahadash

14

La risposta Stringer è, naturalmente , corretta. Ho pensato che potrebbe essere utile per chiarire come funziona, perché "()" insn't davvero una dichiarazione di vuoto o effetto collaterale vuota ...

in F #, ogni pezzo valida di codice è un'espressione. Costrutti come let e match sono costituiti da alcune parole chiave, modelli e diverse sottoespressioni. La F # grammatica per let e match si presenta così:

<expr> ::= let <pattern> = <expr> 
      <expr> 
     ::= match <expr> with 
      | <pat> -> <expr> 

Ciò significa che il corpo del let o il corpo di clausola match deve essere qualche espressione. Può essere una chiamata di funzione come ignore 0 o può essere un valore - nel tuo caso deve essere un'espressione di tipo unit, perché printfn ".." è anche di tipo unit.

Il tipo unit è un tipo con un solo valore, che è scritto come () (e significa anche tupla vuota senza elementi). Questo è, in effetti, un po 'simile a void in C# con l'eccezione che void non dispone di valori .

BTW: Il seguente codice può apparire come una sequenza di istruzioni, ma è anche espressione:

printf "Hello " 
printf "world" 

Il compilatore F # aggiunge implicitamente ; tra le due linee e ; è un operatore di sequenziamento, che ha la seguente struttura: <expr>; <expr>. Richiede che la prima espressione restituisca unit e restituisca il risultato della seconda espressione.

Questo è un po 'sorprendente quando si proviene da sfondo C#, ma rende il langauge sorprendentemente elegante e consise. Non si limita in alcun modo - si può per esempio scrivere:

if (a < 10 && (printfn "demo"; true)) then // ... 

(Questo esempio non è molto utile - solo una dimostrazione della flessibilità)