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

seq.take不返回元素

  •  1
  • SantiClaus  · 技术社区  · 7 年前

    当我运行以下代码时:

    getTheData() |> Seq.take 3
    

    它不返回元素,而是输出:

    val it : seq<Collections.Generic.KeyValuePair<ID,Data>>
    

    我正在使用Visual Studio 2017和F Interactive 出了什么问题,不输出前3项吗?

    获取数据函数=

    let getTheData() =
        (@"C:\Users\data.xlsx")
        |> (ParseExcel >> datap)
        |> Seq.distinct
        |> Seq.map(fun b -> b.ID, b)
        |> Map.ofSeq
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Aaron M. Eshbach    7 年前

    Seq.take 不被视为F中序列的终端操作。正如注释中所提到的,序列被延迟地评估,只有被认为是“终端”的操作才会导致序列被迭代。终端操作包括 Seq.iter (如果要对每个元素执行操作)和 Seq.toList (如果您想要每个元素的具体化列表),以及 Seq.exactlyOne .

    在F Interactive中,您可能只需评估 it 以查看前几个值。在下面的示例中,镜像您的,评估 最后将显示所取的3个值:

    open System
    
    let getTheData() =
        seq {
            for n in {0..1000} -> Guid.NewGuid(), n
        } |> Map.ofSeq
    
    getTheData()
    |> Seq.take 3;;
    
    it;;
    val it : seq<Collections.Generic.KeyValuePair<Guid,int>> =
      seq
        [[001830fe-9ce3-4649-8609-571e4aedb4c7, 791]
           {Key = 001830fe-9ce3-4649-8609-571e4aedb4c7;
            Value = 791;};
         [001bf0a9-5981-4bc0-bcaf-046af7f4866a, 383]
           {Key = 001bf0a9-5981-4bc0-bcaf-046af7f4866a;
            Value = 383;};
         [004b44a7-85d2-4ce5-91bf-49bcc44f03ba, 91]
           {Key = 004b44a7-85d2-4ce5-91bf-49bcc44f03ba;
            Value = 91;}]