接续不会返回元素

时间:2018-09-12 17:03:38

标签: visual-studio f#

当我运行以下代码时:

getTheData() |> Seq.take 3

它不返回元素,而是输出以下内容:

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

我正在使用Visual Studio 2017和F#Interactive 怎么了,应该不输出前三个项目吗?

getTheData函数=

let getTheData() =
    (@"C:\Users\data.xlsx")
    |> (ParseExcel >> datap)
    |> Seq.distinct
    |> Seq.map(fun b -> b.ID, b)
    |> Map.ofSeq

1 个答案:

答案 0 :(得分:3)

Seq.take不被认为是对F#中序列的终端操作。如注释中所述,序列是延迟计算的,并且只有被认为是“终端”的操作才会导致序列被迭代。终端操作包括Seq.iter(如果要对每个元素执行操作)和Seq.toList(如果要对每个元素的实例化列表),以及其他类似Seq.exactlyOne的操作。

在F#交互式中,您可能只需要评估it即可看到前几个值。在以下示例中,您的镜像中,最后评估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;}]