Какая причина использования; в списках 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 ]
Мне кажется, что ,
более естественный и легкий на глазах. Просто интересно идея использования ;
? (Не критикуя)
Ответы
Ответ 1
Да, вы должны. Причина в том, что в 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
Ответ 2
Другие ответы указывают на основную причину.
В стороне стоит отметить, что, как и большинство других мест, где точка с запятой используется на языке, альтернативой является новая строка. Например
[ "foo"; "bar"; "baz" ]
также может быть записано как
[ "foo"
"bar"
"baz" ]
или множество других макетов, где точки с запятой заменены символами новой строки.
Ответ 3
[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]
Ответ 4
Просто интересно, какая идея используется;?
Кортежи чаще встречаются в ML, а использование ;
позволяет писать списки кортежей как:
[1, 2; 3, 4]
Исторически F # унаследовал этот синтаксис от OCaml, который создал свой синтаксис, пытаясь удалить более избыточные круглые скобки из стандартного синтаксиса ML.