Какая причина использования; в списках 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.