2

从关于绘制条形图和柱形图的Real-World Functional Programming 博客继此之后,我试图为我的数据绘制一个直方图,该直方图以惰性序列存储在一组元组 (data_value, frequency) 中。

除非我将序列转换为列表,否则它不起作用,错误消息是序列“ the IEnumerable 'T does not support the Reset function”的情况。有没有办法使用 .NET 库从延迟评估的序列中生成直方图/图表等?

另外(好的新手查询警报),当程序从控制台运行时,有什么方法可以使图表保持不变?通常System.Console.ReadKey() |> ignore会使图表窗口挂起,否则它会立即消失。到目前为止,我一直在使用“Send to Interactive”查看结果。

4

2 回答 2

4

问题是使用 F# 序列表达式表示法生成的序列(类型为seq<T>,这只是 的别名IEnumerable<T>)不支持该Reset方法。图表库需要该方法(因为每次重绘屏幕都需要获取数据)。

这意味着,例如,以下内容将不起作用:

seq { for x in data -> x } |> FSharpChart.Line

模块中的许多标准库函数Seq都是使用序列表达式实现的,因此结果将不支持Reset. 您可以通过将数据转换为列表(使用List.ofSeq)或数组(使用Array.ofSeq)或使用列表编写代码来解决此问题:

[ for x in data -> x ] |> FSharpChart.Line

...如果您正在使用某些功能,您可以从中获取一个List(并非所有Seq功能都可用于List,因此有时您需要使用转换):

[ for x in data -> x ] |> List.choose op |> FSharpChart.Line
于 2012-07-07T10:09:46.967 回答
3

不,它不接受序列。

也就是说,不支持 seq 是有充分理由的。它与结构本身有关:seq 就是一个 seq,因此不也不应该支持绘制图形所需的操作。也就是说,我真的希望这个堆栈更高级并支持更多的使用风格。

所以答案是

|> Seq.toArray

或者

|> Seq.toList

在发送到图表库之前

于 2012-07-07T10:01:37.370 回答