2010-09-20 2 views
12

Cela pourrait être une question étrange, mais si je veux définir une liste d'entiers de:Quelle est la raison de l'utilisation; dans les listes F # au lieu de,?

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

Ai-je besoin de le faire en utilisant le caractère ;?

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

au lieu de

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

?: Il me semble que , est plus naturel et facile sur les yeux. Je me demandais juste l'idée derrière l'utilisation ;? (Ne pas critiquer)

Répondre

16

Oui, vous devez. La raison en est que dans F # l'opérateur virgule est utilisé pour les expressions de tuple. Donc l'expression 1,2,...9 est interprétée comme un seul tuple avec 9 valeurs.

[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

Merci Jared, alors la raison, est utilisée pour les tuples parce que définir des tuples littéraux est plus commun que de définir des listes littérales, non? –

+3

@Joan Je ne connais pas l'histoire de ce choix, sinon que c'est un hold-up d'OCaml. – JaredPar

+0

Merci Jared. Je l'ai maintenant. –

7

[1,2,3,4,5] est une liste de 1 élément de type int * int * int * int * int

[1;2;3;4;5] est une liste des 5 éléments de type int

également, comprehensions liste et les plages sont vos amis

let bar = [1..9], 1..9 est une plage donc il est déplié dans 1; 2; 3; ... 9;

let blort = [for i in 1..9 -> i] est une compréhension qui fait la même chose - un peu plus de puissance pour certains problèmes de performances.

Edit: pour être complet, vous pouvez également faire

let foo = [1 
      2 
      3] 

et obtenir une liste de [1; 2; 3]

+0

Merci, pourquoi y a-t-il pénalité de perf pour [1..9]? Est-ce que le compilateur ne le déploie pas à [1; 2; 3 ... 9]? –

+0

dans le cas de [1..9] il ne devrait pas y avoir, mais les compréhensions de liste peuvent devenir assez compliquées ie [pour i dans 1 .. 9 -> i * i], j'ai essayé d'utiliser des boucles imbriquées dans la liste compréhensions et a eu quelques problèmes substantiels Séquences d'autre part travaillé correctement. – Snark

+0

Merci, par "problèmes substantiels" vous voulez dire des problèmes de perf? Aussi donc [1..9] se déroule au moment de la compilation mais [pour i dans 1 .. 9 -> i * i] est déplié à l'exécution? Ou sont-ils tous exécutés à l'exécution? –

14

D'autres réponses ont souligné la principale raison.

En aparté, il est intéressant de noter que, comme la plupart des autres endroits qui est utilisé dans des points-virgules la langue, une alternative est une nouvelle ligne. Par exemple

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

peut également être écrit comme

[ "foo" 
    "bar" 
    "baz" ] 

ou une variété d'autres dispositions où sont remplacés par des points-virgules nouvelles lignes.

+0

Merci le tour de nouvelle ligne est utile. –

4

Je me demandais juste l'idée derrière l'utilisation;?

Tuples sont plus fréquents chez les ML et l'utilisation ; vous permet d'écrire des listes de tuples:

[1, 2; 3, 4] 

Historiquement, F # a hérité cette syntaxe de OCaml qui a créé sa syntaxe en essayant de supprimer entre parenthèses plus superflus de Syntaxe ML standard

Questions connexes