使用F#制图不会占用Seq?

时间:2012-07-07 05:29:47

标签: f# charts f#-interactive

关于绘图栏和柱形图的Real-World Functional Programming blog之后,我试图为我的数据绘制直方图,该数据以懒惰序列存储在一组元组(data_value,frequency)中。

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

另外(ok新手查询提醒),有没有办法让程序从控制台运行时图表仍然存在?通常的System.Console.ReadKey() |> ignore会使图表窗口挂起,否则会立即消失。我一直在使用“发送到互动”来查看结果。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

不,它不接受序列。

那就是说,有充分的理由不支持seq。它是关于结构本身的:seq就是那个,seq,因此没有, 不应该 ,支持绘制图形所需的操作。也就是说,我真的希望这个堆栈更先进并支持更多的使用方式。

所以答案是

|> Seq.toArray

|> Seq.toList
发送到图表库之前