В чем разница между этими двумя последовательностями F #? - PullRequest
3 голосов
/ 06 марта 2009
> seq { for i in 0..3 do yield float i };;
val it : seq<float> = seq [0.0; 1.0; 2.0; 3.0]
> seq [ for i in 0..3 do yield float i ];;
val it : seq<float> = [0.0; 1.0; 2.0; 3.0]

P.S. почему F # первоначально ожидал последовательности без префикса "seq", но теперь они хотят префикс?

Ответы [ 2 ]

5 голосов
/ 06 марта 2009

Дополнительные пояснения по двум отправленным вами формам:

Первый использует прямое понимание последовательности, "seq {...}". Часть «seq» ранее была необязательной, но в будущем она не будет поддерживаться. Я предполагаю, что это усложняет такие вещи, как "async {...}" и синтаксис рабочего процесса или что-то в этом роде.

Теперь второй - чистый список:

> let x = [ for i in 0..3 do yield float i ];;

val x : float list

«seq» также является функцией:

> seq;;
val it : (seq<'a> -> seq<'a>) = <fun:clo@0_1>

И поскольку любой список также является последовательностью, выполнение "seq [1; 2; 3;]" просто применяет функцию seq к списку. Это похоже на приведение к seq из типа списка.

> x;;
val it : float list = [0.0; 1.0; 2.0; 3.0]

> seq x;;
val it : seq<float> = [0.0; 1.0; 2.0; 3.0]

Edit: источник для функции seq:

let seq (x : seq<_>) = (x :> seq<_>)

Таким образом, "sorta like casting it" должно читаться как "casting it via helper function". Что касается печати последовательностей внутри скобок, я думаю, что это просто симпатичный артефакт печати. ​​

3 голосов
/ 06 марта 2009

Первый - это seq (IEnumerable).

Второй странный; избавиться от 'seq' и это понимание списка (list). Там нет причин, чтобы написать это как есть; либо используйте seq {} или [] или [| |] чтобы создать последовательность, список или массив.

curlies-not-prefixed-by-seq - это форма, которая устарела, поскольку делает некоторые другие части языка потенциально двусмысленными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...