Próbowałem użyć Deedle F# Library, aby napisać program wsadowy F #. Działa doskonale. Jednak nie jestem pewien co do najlepszego projektu dla następujących zadań: 2Projektowanie modułu F # do wywołania przez C# (Console/MVC/WPF)
połączyć moduł F # do istniejącej/Web systemu Api ASP.net MVC
Tworzenie interfejsu WPF, aby służyć jako panel kontrolny i wizualny kontroler zależności dla różnych modułów F #.
Typ zadań wykonywanych przez moduły F # polega na przetwarzaniu szeregów czasowych i zastosowaniu procesów statystycznych w celu uzyskania nowych szeregów czasowych.
Próbowałem utworzyć wrapper klasy dla istniejącego modułu, aby można go było wywołać z kodu C#. Czytam od C# Deep Dive, że jest to lepszy sposób na ujawnienie modułów F # do wywołań C#.
Poniżej owinięcie próbki:
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
Poniżej znajduje się moduł próbki, gdzie większość z logiką powinny znajdować się:
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
staram się używać NUnit służyć jako dzwoniący C#. Znalazłem większość logiki w klasie do/let binding
. Metody członkowskie służą jako przekazujące wyniki do osoby dzwoniącej. Nie sądzę, że moje podejście jest poprawne.
Czy ktoś może wskazać mi właściwy kierunek? (Próbowałem nauczyć się F# WPF Framework na GitHub, ale nie jestem jeszcze gotowy do wykonania zadania)
Jestem świadomy, że Deedle jest również dostępny dla C#. Ale naprawdę chcę użyć F #. przykładowy kod ma faktycznie zbyt wiele skutków ubocznych.
Powinieneś przejrzeć: http://fsharp.org/specs/component-design-guidelines/ – mydogisbox
Jakie jest Twoje aktualne pytanie? Wywołanie (napisanego w języku F) interfejsu CLR z C# nie jest problemem .... – Robetto