当我运行以下代码时:
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
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;}]