2014-12-16 10 views
13

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)

  1. połączyć moduł F # do istniejącej/Web systemu Api ASP.net MVC

  2. 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.

+3

Powinieneś przejrzeć: http://fsharp.org/specs/component-design-guidelines/ – mydogisbox

+0

Jakie jest Twoje aktualne pytanie? Wywołanie (napisanego w języku F) interfejsu CLR z C# nie jest problemem .... – Robetto

Odpowiedz

4

Mówiąc wprost, chcesz zbudować jak trochę swojego UI i ramach w F #, jak to możliwe. Jak już zauważyłeś, F # jest świetnym językiem, kiedy jest świetny; w przeciwnym razie nie jest zalecany do budowania aplikacji (niektórzy hardcorowi fancy języków funkcjonalnych mogą z tym walczyć, ale ja to robię, haha).

Zalecam umieszczenie całego kodujednostki F # w przenośnej bibliotece F # (https://msdn.microsoft.com/en-us/library/hh913781.aspx). Odwołanie do tej biblioteki i wywoływanie z niej metod jest tak proste, jak wywoływanie klas i metod, jak w klasach i metodach C# lub VB.

Istnieje również kilka szablonów, których można użyć (http://blogs.msdn.com/b/mcsuksoldev/archive/2011/06/05/f-class-library-template.aspx).