¿Cuál es la diferencia entre estas dos secuencias F #?
Pregunta
> seq { for i in 0..3 do yield float i };;
val it : seq<float> = seq [0.0; 1.0; 2.0; 3.0]
> seq [ for i in 0..3 do yield float i ];;
val it : seq<float> = [0.0; 1.0; 2.0; 3.0]
P.S. ¿Por qué F # originalmente esperaba secuencias sin el " seq " prefijo, pero ahora quieren el prefijo?
Solución
Más aclaraciones sobre los dos formularios que publicó:
El primero utiliza una comprensión de secuencia directa, " seq {...} " El " seq " La parte era opcional antes, pero eso no será compatible en el futuro. Supongo que hace cosas como " async {...} " y la sintaxis del flujo de trabajo es más difícil o algo así.
Ahora, el segundo es una lista pura:
> let x = [ for i in 0..3 do yield float i ];;
val x : float list
" seq " También es una función:
> seq;;
val it : (seq<'a> -> seq<'a>) = <fun:clo@0_1>
Y dado que cualquier lista es también una secuencia, hacer "seq [1; 2; 3;] " solo está aplicando la función seq a la lista. Es algo así como lanzarlo a seg. Del tipo de lista.
> x;;
val it : float list = [0.0; 1.0; 2.0; 3.0]
> seq x;;
val it : seq<float> = [0.0; 1.0; 2.0; 3.0]
Editar: la fuente de la función seq es:
let seq (x : seq<_>) = (x :> seq<_>)
Por lo tanto, " a sorta le gusta lanzarlo " debería leer "lanzarlo a través de una función auxiliar". En cuanto a la impresión de secuencias entre paréntesis, creo que es solo un bonito artefacto de impresión.
Otros consejos
El primero es un seq (IEnumerable).
El segundo es raro; deshacerse del 'seq' y es una lista de comprensión (lista). No hay razón para escribirlo como es; use seq {} o [] o [| |] para hacer una secuencia o una lista o una matriz.
Los curlies-not-prefixed-by-seq es una forma que quedará en desuso, ya que hace que otras partes del lenguaje sean potencialmente ambiguas.