Разница между списком и [] в F # - PullRequest
4 голосов
/ 13 марта 2012

Я портирую некоторый код на Haskell на F #, но немного запутался из-за доступных коллекций и их подписей в F #. Насколько я понимаю, элементы в списках заключены между [], последовательностями между {} и массивами между [| |]. В F # Interactive я получаю следующее, когда создаю каждый контейнер с 5 дюймами.

// List
> [1..5]
val it : int list = [1; 2; 3; 4; 5]

// Seq
> {1..5}
val it : seq<int> = seq [1; 2; 3; 4; ...]

// Array
> [|1..5|]
val it : int [] = [|1; 2; 3; 4; 5|]

Что меня смущает, так это то, что сигнатура типа для массивов int []. Может быть, тип int array или int [||] будет менее запутанным? Глядя на сигнатуру типа, я склонен думать, что это список, особенно потому, что пустой список также представлен как [].

Один вопрос здесь: почему тип последовательности seq<int>, а не int seq. Я предполагаю, что это может быть синтаксическим сахаром, но, возможно, за этим стоит что-то еще.

Теперь создаем новые типы, используя коллекцию:

type T1 = T1 of int list
type T2 = T2 of int seq // becomes type T2 = T2 of seq<int>
type T3 = T3 of int array
type T4 = T4 of int []

Т3 и Т4 - это одно и то же?

1 Ответ

6 голосов
/ 13 марта 2012

F # позволяет использовать определения типов стилей .Net и определения типов стилей ocaml. Это то же самое.

int list
list<int>  

int seq
seq<int>

int array
array<int>

Некоторые Выражения в F # :

[||] is an array
[] is a list
{} is a sequence

В определении типа вы также можете сделать int []. Который С, как синтаксис сахара. Да, T3 и T4 одинаковы.

Однако вы не можете сделать это []<int>. [] немного странно, поскольку он ведет себя как массив типов в определении типа и как op_Nil в выражении.

...