2010-09-20 6 views
12

Esto podría ser una pregunta extraña, pero si quiero definir una lista de números enteros de:¿Cuál es el motivo de usar; en listas F # en lugar de,?

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

¿Tengo que hacerlo utilizando el carácter ;?

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

en lugar de ?:

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

Simplemente me parece , es más natural y fácil en los ojos. Me preguntaba la idea detrás de usar ;? (Sin criticar)

Respuesta

16

Sí, debe. La razón es que en F # el operador de coma se usa para expresiones de tuplas. Por lo tanto, la expresión 1,2,...9 se interpreta como una sola tupla con 9 valores.

[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

Gracias Jared, entonces el motivo, se usa para tuplas es porque la definición de tuplas literales es más común que la definición de listas literales, ¿no? –

+3

@Joan No conozco la historia de esta elección más allá de que es una reserva de OCaml. – JaredPar

+0

Gracias Jared. Lo entiendo ahora. –

7

[1,2,3,4,5] es una lista de 1 elemento de tipo int * int * int * int * int

[1;2;3;4;5] es una lista de 5 elementos de tipo int

también, listas por comprensión y rangos son sus amigos

let bar = [1..9], 1..9 es un rango para que se despliegue en 1; 2; 3; ... 9;

let blort = [for i in 1..9 -> i] es una comprensión que hace lo mismo: un poco más de potencia para algunos problemas de rendimiento.

Editar: para completarlo, también se puede hacer

let foo = [1 
      2 
      3] 

y obtener una lista de [1; 2; 3]

+0

Gracias, ¿por qué hay penalización de perf por [1..9]? ¿No es el compilador que simplemente lo despliega en [1; 2; 3 ... 9]? –

+0

en el caso de [1..9] no debería haber, pero la lista de comprensiones puede ser bastante complicada, es decir [para i en 1 .. 9 -> i * i], he intentado usar ciclos anidados para la lista comprensiones y tenía algunos problemas sustanciales Las secuencias por otro lado funcionaban bien. – Snark

+0

Gracias, por "problemas sustanciales" ¿te refieres a problemas de perfusión? También para que [1..9] se despliegue en tiempo de compilación pero [para i en 1 .. 9 -> i * i] se despliega en tiempo de ejecución? ¿O son todos ejecutados en tiempo de ejecución? –

14

Otras respuestas han señalado la razón principal.

Como nota aparte vale la pena señalar que, como la mayoría de los otros lugares en los que se usa el punto y coma en el idioma, una alternativa es una nueva línea. Por ejemplo

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

también puede ser escrito como

[ "foo" 
    "bar" 
    "baz" ] 

o una variedad de otros diseños donde comas se sustituyen por nuevas líneas.

+0

Gracias el truco de la nueva línea es útil. –

4

Solo me preguntaba la idea de usar;?

Las tuplas son más comunes en ML y el uso de ; le permite escribir una lista de tuplas como:

[1, 2; 3, 4] 

Históricamente, F # heredó esta sintaxis de OCaml que creó su sintaxis, tratando de eliminar el paréntesis más superfluos desde Sintaxis ML estándar.

Cuestiones relacionadas