Seq.take不会返回元素

问题描述 投票:1回答:1

当我运行以下代码时:

getTheData() |> Seq.take 3

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

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

我正在使用Visual Studio 2017和F#Interactive有什么问题,它应该输出前3项吗?

getTheData函数=

let getTheData() =
    (@"C:\Users\data.xlsx")
    |> (ParseExcel >> datap)
    |> Seq.distinct
    |> Seq.map(fun b -> b.ID, b)
    |> Map.ofSeq
visual-studio f#
1个回答
3
投票

Seq.take不被视为F#中序列的终端操作。正如评论中所提到的,序列被懒惰地评估,并且只有被认为是“终端”的操作才会导致序列被迭代。终端操作包括Seq.iter(如果你想对每个元素执行一个动作)和Seq.toList(如果你想要一个每个元素的物化列表),以及其他像Seq.exactlyOne

在F#interactive中,您可以只评估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;}]
© www.soinside.com 2019 - 2024. All rights reserved.