Syntax 什么';这两个F#序列的区别是什么? >seq{0..3中的i产生浮点i};; valit:seq=seq[0.0;1.0;2.0;3.0] >seq[对于0..3中的i,不产生浮动i];; valit:seq=[0.0;1.0;2.0;3.0]

Syntax 什么';这两个F#序列的区别是什么? >seq{0..3中的i产生浮点i};; valit:seq=seq[0.0;1.0;2.0;3.0] >seq[对于0..3中的i,不产生浮动i];; valit:seq=[0.0;1.0;2.0;3.0],syntax,f#,Syntax,F#,另外,为什么F#最初期望序列没有“seq”前缀,但现在他们想要前缀?第一个是seq(IEnumerable) 第二个很奇怪;去掉“seq”,它就是一个列表理解(list)。没有理由照原样写;使用seq{}或[]或[| |]生成seq或列表或数组 不带seq前缀的卷发将被弃用,因为它可能会使语言的其他部分变得模棱两可。关于您发布的两个表单的更多说明: 第一个使用直接序列理解,“seq{…}”。“seq”部分以前是可选的,但将来不支持。我想这会让“async{…}”和工作流语法变得更加困难 现在,第

另外,为什么F#最初期望序列没有“seq”前缀,但现在他们想要前缀?

第一个是seq(IEnumerable)

第二个很奇怪;去掉“seq”,它就是一个列表理解(list)。没有理由照原样写;使用seq{}或[]或[| |]生成seq或列表或数组


不带seq前缀的卷发将被弃用,因为它可能会使语言的其他部分变得模棱两可。

关于您发布的两个表单的更多说明:

第一个使用直接序列理解,“seq{…}”。“seq”部分以前是可选的,但将来不支持。我想这会让“async{…}”和工作流语法变得更加困难

现在,第二个是一个纯列表:

> 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]
“seq”也是一个函数:

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

val x : float list
>seq;;
val it:(seq)=
由于任何列表也是一个序列,所以执行“seq[1;2;3;]”只是将seq函数应用于列表。这有点像从列表类型将其转换为seq

> seq;;
val it : (seq<'a> -> seq<'a>) = <fun:clo@0_1>
>x;;
val it:float list=[0.0;1.0;2.0;3.0]
>序号x;;
valit:seq=[0.0;1.0;2.0;3.0]
编辑: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(x:seq)=(x:seq)

所以,“sorta like casting it”应该改为“通过助手函数进行casting”。至于括号内序列的打印,我认为这只是一个漂亮的打印工件。

我太新手了,不知道第一种和第二种形式之间的区别。请您澄清一下好吗?第二种形式实际上是一个列表,正如[]所指出的。seq只是在它被生成为一个列表后将其转换为一个序列。令人困惑的是,解释器说“seq{for i in 0..3确实产生float i};”的值为“seq[0.0;1.0;2.0;3.0]”,但是如果你键入“seq[0.0;1.0;2.0;3.0];“解释器直接说它的值为”[0.0;1.0;2.0;3.0]”。正在应用seq函数“有点”类似于按顺序(=IEnumerable)进行强制转换,或者是F#的直接等效于强制转换?或者,F#是否有单独的强制转换操作符?F#的强制转换操作符是:>用于向上强制转换,而:?>用于向下强制转换。
let seq (x : seq<_>) = (x :> seq<_>)