关于绘图栏和柱形图的Real-World Functional Programming blog之后,我试图为我的数据绘制直方图,该数据以懒惰序列存储在一组元组(data_value,frequency)中。
除非我将序列转换为List,否则它不起作用,错误消息是序列“the IEnumerable 'T does not support the Reset function
”的情况。有没有办法从懒惰评估的序列中使用.NET库生成直方图/图表等?
另外(ok新手查询提醒),有没有办法让程序从控制台运行时图表仍然存在?通常的System.Console.ReadKey() |> ignore
会使图表窗口挂起,否则会立即消失。我一直在使用“发送到互动”来查看结果。
答案 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
发送到图表库之前