2009-12-11 5 views
19

Sto provando a fare un po 'di comprensione delle liste in F #. E ho trovato this.comprensione della lista in F #

let evens n = 
    { for x in 1 .. n when x % 2 = 0 -> x } 
print_any (evens 10) 

let squarePoints n = 
    { for x in 1 .. n 
     for y in 1 .. n -> x,y } 
print_any (squarePoints 3) 

Il primo funziona ancora correttamente, ma il secondo è obsoleto. L'ultimo (1.9.7.8) compilatore F # non supporta questo stile.

Dopo qualche ricerca ho trovato che questo funziona

let vec1 = [1;2;3] 
let vec2 = [4;5;6] 
let products = [for x in vec1 do for y in vec2 do yield x*y] 

può puntare a qualcuno perché la sintassi cambiato? Grazie.

risposta

20
  • I cicli nidificati richiedono un do.

  • È necessario utilizzare seq {..}. Il modulo {..} senza seq non funziona più.

  • Una protezione when in un modello di ciclo for non è più supportata.

  • print_any something obsoleto. Utilizzare invece printf "%A" something.

Questo codice dovrebbe funzionare:

let evens n = 
    seq { for x in 1 .. n do if x%2=0 then yield x } 
printf "%A" (evens 10) 

let squarePoints n = 
    seq { for x in 1 .. n do 
      for y in 1 .. n -> x,y } 
printf "%A" (squarePoints 3) 

è comunque possibile utilizzare la -> se tutto quello che volete fare è restituire un singolo valore:

let vec1 = [1;2;3] 
let vec2 = [4;5;6] 
let products = [for x in vec1 do for y in vec2 -> x*y] 

A proposito, ho trovato è interessante vedere come F # si è evoluta nel tempo. Peccato che i primi utenti abbiano libri parzialmente obsoleti sui loro scaffali (non che mi dispiaccia).

+2

Bene, i primi adepti non avevano molta scelta in quel momento :) – Benjol

+3

Né abbiamo adottato in anticipo gli autori. ;-) –