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à)
Dove "()" è il valore di tipo "unità", e "unità" è il tipo di ritorno di "printfn", in qualche modo simile a "void". – Brian
Perfetto, grazie! –
Posso usarlo per il ciclo Empty While? – fahadash