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

Другие вопросы по тегам