代码之家  ›  专栏  ›  技术社区  ›  Qwertie

这两个F#序列有什么区别?

  •  3
  • Qwertie  · 技术社区  · 16 年前
    > 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]
    

    2 回复  |  直到 16 年前
        1
  •  5
  •   MichaelGG    16 年前

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

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

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

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

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

    > 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<_>)
    

        2
  •  3
  •   Brian    16 年前

    第二个是奇怪的;去掉“seq”,这是一个列表理解(list)。没有理由照原样写;使用seq{}或[]或[||]来创建seq、列表或数组。

    不以seq为前缀的curlies是一种将被弃用的形式,因为它会使语言的其他一些部分变得模糊。