我正在尝试扩展James Hugard's post How do I plot a data series in F#?,但在使用数量可变的函数参数时遇到了一个小故障。如果我特别为Hugard的LineChartForm指定函数,当加载到F#交互式解释器中时,代码会按预期工作:
(* This code is based off of a Stack Overflow post by
James Hugard @
https://stackoverflow.com/questions/3276357/how-do-i-plot-a-data-series-in-f
*)
module HuggardPlot
#r "System.Windows.Forms.DataVisualization"
open System.Windows.Forms
open System.Windows.Forms.DataVisualization.Charting
type LineChartForm( title, minX, maxX, func1, func2) =
inherit Form( Text=title )
let chart = new Chart(Dock=DockStyle.Fill)
let area = new ChartArea(Name="Area1")
(* Add the first plot Hugard style *)
let series = new Series()
do series.ChartType <- SeriesChartType.Line
do for i in minX .. maxX do
series.Points.AddXY(i, func1(i)) |> ignore
do series.ChartArea <- "Area1"
do chart.Series.Add( series )
(* Add the second plot Hugard style *)
let series2 = new Series()
do series2.ChartType <- SeriesChartType.Line
do for i in minX .. maxX do
series2.Points.AddXY(i, func2(i)) |> ignore
do series2.ChartArea <- "Area1"
do chart.Series.Add( series2 )
(* Add area1 to the plot *)
do chart.ChartAreas.Add(area)
do base.Controls.Add( chart )
(* Convenience method to make it easier to plot functions *)
let plotTwoFunctions minX maxX f1 f2 =
let LCF = new LineChartForm("lines", minX, maxX, f1, f2);
LCF.Show();另一方面,如果我尝试使用http://msdn.microsoft.com/en-us/library/dd233213.aspx的参数数组部分中的技术,通过以下代码的ParamArray传递数量可变的函数:
(* This code is based off of a Stack Overflow post by
James Hugard @
https://stackoverflow.com/questions/3276357/how-do-i-plot-a-data-series-in-f
*)
module HuggardPlot
#r "System.Windows.Forms.DataVisualization"
open System
open System.Windows.Forms
open System.Windows.Forms.DataVisualization.Charting
type LineChartForm(
title,
minX,
maxX,
[<ParamArray>] funcs: Object[]) =
inherit Form( Text=title )
let chart = new Chart(Dock=DockStyle.Fill)
let area = new ChartArea(Name="Area1")
do for func in funcs do
(* Add the first plot Hugard style *)
let series = new Series()
do series.ChartType <- SeriesChartType.Line
do for i in minX .. maxX do
series.Points.AddXY(i, func(i)) |> ignore
do series.ChartArea <- "Area1"
do chart.Series.Add( series )
(* Add area1 to the plot *)
do chart.ChartAreas.Add(area)
do base.Controls.Add( chart )
(* Convenience method to make it easier to plot functions *)
let plotTwoFunctions minX maxX f1 f2 =
let LCF = new LineChartForm("lines", minX, maxX, f1, f2);
LCF.Show();我在第27行得到一个错误
series.Points.AddXY(i, func(i)) |> ignore
“此值不是函数,无法应用”,在"func“下有一个红色的波浪形标记。
我怀疑这与我使用[<ParamArray>] funcs: Object[]作为Hugard先生的LineChartForm类型的参数定义有关。
我应该将[<ParamArray>] funcs: Object[]更改为什么,以便第二个代码示例的第27行将"func“识别为函数?
发布于 2013-05-28 11:03:03
如果您想创建一个接受params函数数组的方法,那么您需要将参数定义为[<ParamArray>] funcs: (float -> float)[]。在最初的版本中,类型是Object[],这意味着数组的各个元素都是对象-如果您将元素的类型更改为函数,那么F#将识别您可以调用它们。
但是,如果您只是对绘制F#数据感兴趣,那么已经为WinForms DataVisualization库提供了一个很好的包装器,称为F# Chart and available on GitHub。还有一个全面的documentation available on MSDN (如果您使用的是最新版本的库,那么FSharpChart已被重命名为Chart)。
要创建在指定范围内比较两个函数的图,您可以简单地编写:
let plotTwoFunctions minX maxX f1 f2 =
Chart.Combine
[ Chart.Line [ for x in minX .. maxX -> x, f1 x ]
Chart.Line [ for x in minX .. maxX -> x, f2 x ] ]这将创建两个单独的折线图(包含由两个函数生成的数据),然后使用Chart.Combine将它们合并为一个图表。
https://stackoverflow.com/questions/16783196
复制相似问题