В чем разница между этими двумя последовательностями F#?

StackOverflow https://stackoverflow.com/questions/616973

  •  03-07-2019
  •  | 
  •  

Вопрос

> 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 — это форма, которая будет признана устаревшей, поскольку она делает некоторые другие части языка потенциально неоднозначными.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top