【问题标题】:What's the difference between these two F# sequences?这两个 F# 序列有什么区别?
【发布时间】:2009-03-05 22:34:03
【问题描述】:
> 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]

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

【问题讨论】:

    标签: syntax f#


    【解决方案1】:

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

    第一个使用直接序列理解,“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 { for i in 0..3 do yield 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 函数“有点像”像强制转换为 seq (=IEnumerable),还是 F# 直接等效于强制转换?
    • 或者,F# 有单独的强制转换运算符吗?
    • F# 的强制转换运算符是 :> 用于向上转换和 :?> 用于向下转换。
    【解决方案2】:

    第一个是seq(IEnumerable)。

    第二个很奇怪;摆脱'seq',它是一个列表理解(列表)。没有理由按原样编写它。使用 seq{ } 或 [ ] 或 [| |] 来创建一个序列或一个列表或一个数组。

    curlies-not-prefixed-by-seq 是一种将被弃用的形式,因为它使语言的其他部分可能不明确。

    【讨论】:

    • 我太新手了,不知道第一种和第二种形式之间的区别。你介意澄清一下吗?
    • 第二种形式实际上是一个列表,如 [ ] 所示。 seq 只是在它被生成为一个列表后将它变成一个序列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2016-10-06
    相关资源
    最近更新 更多