2009-12-11 13 views
19

Estoy tratando de hacer una lista de comprensión en F #. Y encontré this.comprensión de lista en 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) 

La primera sigue funcionando bien, pero la segunda está desactualizada. El último (1.9.7.8) compilador F # no es compatible con este estilo.

Después de algún búsqueda me encontré con esto funciona

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] 

puede apuntar a alguien por qué la sintaxis cambiado? Gracias.

Respuesta

20
  • bucles for anidados requieren un do.

  • Necesita usar seq {..}. El formulario {..} sin seq ya no funciona.

  • A when guarda en un patrón de lazo for tampoco es compatible.

  • print_any something está obsoleto. Use printf "%A" something en su lugar.

Este código debería funcionar:

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) 

También puede usar el -> si todo lo que quiere hacer es devolver un único valor:

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

Por cierto, me parece es interesante ver cómo F # evolucionó con el tiempo. Es una lástima que los primeros en adoptar libros parcialmente obsoletos en sus estantes (no es que me importe).

+2

Bueno, los primeros usuarios no tenían mucha opción en ese momento :) – Benjol

+3

Tampoco adoptamos antes a los autores. ;-) –

Cuestiones relacionadas