В чем разница между этими двумя последовательностями F#?
Вопрос
> 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», но теперь им нужен префикс?
Решение
Дополнительные разъяснения по двум опубликованным вами формам:
Первый использует прямое понимание последовательности: «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]
Редактировать:Источником функции seq является:
let seq (x : seq<_>) = (x :> seq<_>)
Итак, «что-то вроде приведения» следует читать «приведение через вспомогательную функцию».Что касается печати последовательностей внутри скобок, то я думаю, что это просто красивый артефакт печати.
Другие советы
Первый — это seq (IEnumerable).
Второе странное;избавьтесь от «seq», и это будет понимание списка (список).Нет смысла писать все как есть;либо используйте seq{ }, либо [ ] или [| |] для создания seq, списка или массива.
Curlies-not-prefixed-by-seq — это форма, которая будет признана устаревшей, поскольку она делает некоторые другие части языка потенциально неоднозначными.