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