gpt4 book ai didi

c# - 设计一个F#模块被C#调用(Console/MVC/WPF)

转载 作者:可可西里 更新时间:2023-11-01 08:12:11 31 4
gpt4 key购买 nike

我一直在尝试使用Deedle F# Library编写 F# 批处理程序。它工作得很好。但是,我不确定以下 2 个任务的最佳设计:

  1. 将F#模块合并到现有的ASP.net MVC/Web Api系统中

  2. 创建一个 WPF 界面作为各种 F# 模块的控制面板和视觉依赖 Controller 。

F# 模块执行的任务类型是处理时间序列和应用统计过程来导出新的时间序列。

我一直在尝试为现有模块创建一个类包装器,以便可以从 C# 代码中调用它。我从 C# Deep Dive 读到这是向 C# 调用者公开 F# 模块的更好方法。

以下是示例包装器:

type TimeSeriesDataProcessor(fileName:string) = 
let mutable _fileName = fileName
let _rawInputData = loadCsvFile _fileName
let _pivotedData = _rawInputData
|> pivotRawData
|> fillPivotedRawData
|> calculateExpandingZscore

//read and write
member this.FileName
with get () = _fileName
and set (value) = _fileName <- value
member this.RawInputData
with get () = _rawInputData
member this.PivotedData
with get () = _pivotedData
member this.rawInputDataCount
with get () = _rawInputData.RowCount
member this.pivotedDataCount
with get () = _pivotedData.RowCount

下面是一个示例模块,大部分逻辑都应该在其中:

 module Common = 

let loadCsvFile (fileName:string ) : Frame<int,string> =
let inputData = Frame.ReadCsv(fileName)
inputData


let pivotRawData inputData:Frame<DateTime,string> =
let pivotedData = inputData |> Frame.pivotTable (fun k r -> r.GetAs<DateTime>("Date"))
(fun k r -> r.GetAs<string>("Indicator"))
(fun f -> let maxVal = f?Value |> Stats.max
match maxVal with
| Some mv -> mv
| _ -> Double.NaN
)
pivotedData

let fillPivotedRawData inputData:Frame<DateTime,string> =
let filledA = inputData?A |> Series.fillMissing Direction.Forward
inputData?A<-filledA
let filledB = inputData?B |> Series.fillMissing Direction.Forward
inputData?B<-filledB

inputData

let calculateExpandingZscore inputData:Frame<DateTime,string> =
let expandingMeanColA = inputData?A |> Stats.expandingMean
let expandingMeanColB = inputData?B |> Stats.expandingMean
let expandingStdevColA = inputData?A |> Stats.expandingStdDev
let expandingStdevColB = inputData?B |> Stats.expandingStdDev
let expandingZscoreColA = (inputData?A - expandingMeanColA)/expandingStdevColA
let expandingZscoreColB = (inputData?B - expandingMeanColB)/expandingStdevColB
inputData?ExpdingMeanA <- expandingMeanColA
inputData?ExpdingMeanB <- expandingMeanColB
inputData?ExpdingStdevA <- expandingStdevColA
inputData?ExpdingStdevB <- expandingStdevColB
inputData?ExpdingZscoreA <- expandingZscoreColA
inputData?ExpdingZscoreB <- expandingZscoreColB
inputData

我一直在尝试使用 NUnit 作为 C# 调用程序。我发现自己将大部分逻辑放在类 do/let binding 中。成员方法用作将结果传递给调用者。我认为我的方法不正确。

有人能指出我正确的方向吗? (我试图在 GitHub 上学习 F# WPF Framework,但我还没有完成任务)

我知道 Deedle 也适用于 C#。但是,我真的很想使用 F#。 示例代码实际上有太多的副作用。

最佳答案

坦率地说,您希望在 F# 中构建尽可能少的UI框架。正如您所指出的,F# 是一种很棒的语言,当它很棒时;否则,不推荐用于应用程序构建(一些铁杆函数式语言的狂热者可能会为此反对我,但我支持它,哈哈)。

我建议将所有工作单元 F# 代码放入可移植 F# 库 (https://msdn.microsoft.com/en-us/library/hh913781.aspx)。然后,引用该库并从中调用方法就像从 C# 或 VB 类和方法中调用类和方法一样简单。

还有一些模板可供您使用 ( http://blogs.msdn.com/b/mcsuksoldev/archive/2011/06/05/f-class-library-template.aspx )。

关于c# - 设计一个F#模块被C#调用(Console/MVC/WPF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501952/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com