2010-09-20 14 views
12

Questa potrebbe essere una domanda strana, ma se voglio definire un elenco di numeri interi da:Qual è il motivo dell'utilizzo; in F # elenca invece di?

1, 2, 3, 4, 5, 6, 7, 8, 9 

non ho bisogno di farlo utilizzando il carattere ;?

[ 1; 2; 3; 4; 5; 6; 7; 8; 9 ] 

anziché ?:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 

Sembra proprio di me , è più naturale e facile sugli occhi. Mi stai solo chiedendo l'idea di usare ;? (Non criticando)

risposta

16

Sì, è necessario. Il motivo per cui in F # viene utilizzato l'operatore virgola per le espressioni di tupla. Quindi l'espressione 1,2,...9 viene interpretata come una singola tupla con 9 valori.

[1,2] // List with 1 element that is a tuple value - (int*int) list 
[1;2] // List with 2 elements that are integer values - int list 
+0

Grazie Jared, quindi il motivo, viene utilizzato per le tuple perché definire tuple letterali è più comune della definizione di elenchi letterali, giusto? –

+3

@Joan Non conosco la cronologia di questa scelta se non quella di una sospensione da OCaml. – JaredPar

+0

Grazie Jared. Ho capito ora. –

7

[1,2,3,4,5] è un elenco di 1 elemento di tipo int * int * int * int * int

[1;2;3;4;5] è una lista di 5 elementi di tipo int

inoltre, la costruzione di lista gamme ei i tuoi amici

let bar = [1..9], 1..9 è un intervallo in modo che venga visualizzato in 1; 2; 3; ... 9;

let blort = [for i in 1..9 -> i] è una comprensione che fa la stessa cosa: un po 'più di potenza per alcuni problemi di prestazioni.

Edit: per completezza, si può anche fare

let foo = [1 
      2 
      3] 

e ottenere un elenco di [1; 2; 3]

+0

Grazie, perché c'è una penalità perfetta per [1..9]? Il compilatore non lo spiega solo in [1; 2; 3 ... 9]? –

+0

nel caso di [1..9] non ci dovrebbe essere, ma le list comprehensions possono diventare piuttosto complicate ie [per i in 1 .. 9 -> i * i], ho provato ad usare annidato per i loop nella lista comprensione e ha avuto alcuni problemi sostanziali Sequenze d'altra parte ha funzionato bene. – Snark

+0

Grazie, per "problemi sostanziali" intendi perf perf? Anche così [1..9] si svolge in fase di compilazione ma [per i in 1 .. 9 -> i * i] è spiegato in fase di runtime? Oppure sono tutti eseguiti in fase di runtime? –

14

altre risposte hanno sottolineato il motivo principale.

Per inciso, vale la pena notare che, come la maggior parte degli altri posti in cui viene utilizzato il punto e virgola nella lingua, un'alternativa è una nuova riga. Ad esempio

[ "foo"; "bar"; "baz" ] 

possono anche essere scritta come

[ "foo" 
    "bar" 
    "baz" ] 

o una varietà di altre configurazioni in cui virgola sono sostituite da nuove righe.

+0

Grazie il trucco di nuova linea è utile. –

4

Basta chiedersi l'idea di utilizzare;?

tuple sono più comuni nei ML e utilizzando ; permette di scrivere liste di tuple come:

[1, 2; 3, 4] 

Storicamente, F # ereditato questa sintassi da OCaml che ha creato la sua sintassi, cercando di rimuovere le parentesi più superflue da Sintassi standard ML.

Problemi correlati