Что является причиной использования; в списках F# вместо,?
Это может быть странный вопрос, но если я хочу определить список целых чисел из:
1, 2, 3, 4, 5, 6, 7, 8, 9
Нужно ли делать это с помощью ;
персонаж?
[ 1; 2; 3; 4; 5; 6; 7; 8; 9 ]
вместо?:
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
Мне просто кажется ,
более естественный и легкий для глаз. Просто интересно, идея использования ;
? (Не критикуя)
4 ответа
Да, вы должны. Причина в том, что в F# оператор запятой используется для выражений кортежей. Итак, выражение 1,2,...9
интерпретируется как один кортеж с 9 значениями.
[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
Другие ответы указывают на основную причину.
Кроме того, стоит отметить, что, как и в большинстве других мест, где точка с запятой используется в языке, альтернативой является перевод строки. Например
[ "foo"; "bar"; "baz" ]
также может быть написано как
[ "foo"
"bar"
"baz" ]
или множество других форматов, где точки с запятой заменяются символами новой строки.
[1,2,3,4,5]
список из 1 элемента типа int * int * int * int * int
[1;2;3;4;5]
список из 5 элементов типа int
Кроме того, список понимания и диапазоны ваших друзей
let bar = [1..9]
, 1..9 - это диапазон, поэтому он разложен на 1; 2; 3;... 9;
let blort = [for i in 1..9 -> i]
это понимание, которое делает то же самое - немного больше энергии для некоторых проблем с производительностью.
Изменить: для полноты вы также можете сделать
let foo = [1
2
3]
и получите список [1;2;3]
Просто интересно, идея использования;
Кортежи чаще встречаются в ML и используют ;
позволяет вам писать списки кортежей как:
[1, 2; 3, 4]
Исторически F# унаследовал этот синтаксис от OCaml, который создал его синтаксис, пытаясь удалить излишние скобки из синтаксиса Standard ML.