Semantica di F # lasciate dichiarazione con una virgola
Domanda
Sto imparando F #. Ho iniziato cercando il F # campioni da Microsoft.
Mi sono imbattuto in questa dichiarazione:
let line1,line2 =
use sr = System.IO.File.OpenText @"test.txt"
let line1 = sr.ReadLine()
let line2 = sr.ReadLine()
(line1,line2)
Qualcuno può spiegare questa affermazione a me?
Che tipo viene definito qui? Una funzione? Una tupla?
Perché line1
e line2
devono essere ridefiniti nella definizione di line1,line2
(let line1 =
... let line2 =
)?
Che cosa è con la linea finale, (line1, line2)
e come funziona questo legame nel tipo di definizione originale? E 'questo il ritorno della funzione?
E 'anche la parola giusta "dichiarazione", per usare una definizione in F #?
Grazie.
Soluzione
La forma generale per i valori di identificatore vincolante in F # è
let pattern = expression
In questo caso, il modello è "linea 1, linea 2", che è un tuple modello, che si aspettano di legarsi ad un 2-tupla di valori e assegnare i nomi "line1" e "LINE2" a questi due valori.
espressione è il prossimo 4 linee. All'interno di quella espressione ci sono variabili locali. Essi capita di essere anche denominata "linea 1" e "Linea 2", ma avrebbero potuto facilmente sono stati rinominati "x" e "y" o qualsiasi altra cosa - la portata di tali identificatori è locale a questa espressione frastagliata. (Il fatto che gli stessi nomi sono usati come i nomi del perimetro esterno ha alcun effetto per quanto riguarda il compilatore è interessato.)
La riga finale se l'espressione è il 'valore di ritorno' dell'espressione. In questo caso restituisce il 2-upla di valori "linea 1" e "riga2" (o "x" e "y" se li rinomina per chiarezza di esposizione). Incidentalmente, poiché questi due valori hanno ciascuno tipo "stringa", il tipo dell'espressione ritorno è "stringa * stringa", che è un 2-tuple dove ogni valore è una stringa. Questo significa che le "linea 1" originali "e line2" nomi sulla prima riga sarà ogni essere dedotto di avere tipo "string".
F # è funzionale, e quindi in un certo senso "tutto è espressione" e "non ci sono dichiarazioni" (solo sequenze di espressioni che sono in sequenza valutati), ma è ok IMO a (ab) usa il termine "dichiarazione "per descrivere l'interno 'let' linee, a meno che non si sta cercando di essere molto precisi.