2013-02-27 12 views
11

Chcę tylko podkreślić, że jest to pytanie nie jest odwrotnościąWytyczne do projektowania C# biblioteki dobrze użytkowej od F #

Best approach for designing F# libraries for use from both F# and C#

Tutaj nie pytam jak zaprojektować bibliotekę funkcjonalną pisemne C# do użycia w obu światach.

Chciałbym wiedzieć dobrych praktyk na co wybory projektowe objąć lub uniknąć uzyskać rozsądny kompromis marka ta biblioteka użytkowej od F #.

Practices jak (na przykład):

  • keep obiekt hierarchia jak najprostsze

  • unikać mutacji stan obiektów, ale powrót nowe

  • itp ...

Każdy, kto już to zrobił, może go udostępnić doświadczenie?

uwaga Side

To ciekawa uwaga ten projekt OSS, IronJS. Tak, jest napisane w języku F #, ale autor ujawnia dwóch wyspecjalizowanych hostów: IronJS.Hosting.FSharp i IronJS.Hosting.CSharp.

+0

Używam biblioteki C# z fsharp i nigdy nie zastanawiałem się nad tym. Nieliczne niedopasowania, jakie napotkałem, to różnica między funkcjami Func i FSharpFunc oraz brakiem typów opcji. – nicolas

Odpowiedz

3

Wyobraźcie sobie, że pewnego dnia chcielibyście przepisać swoją bibliotekę C# w F # dla lepszej użyteczności. Oto drogi jesteś prawdopodobne, aby:

enter image description here

skupię się na ścieżce "Imperatyw C# -> Functional C# -> Functional F # -> Idiomatic F #". Im bardziej funkcjonalna jest Twoja biblioteka C#, tym bardziej użyteczna jest biblioteka w języku F #. Funkcjonalny styl pomaga zwiększyć kompozycyjność i jest bliższy idiomatycznemu kodowi F #. Wzdłuż tych linii, można:

  • Embrace niezmienność domyślnie zasady. Jeśli nie wiesz, czy chcesz później zaktualizować pole/właściwość, najpierw zaznacz to jako readonly.
  • Śledź styl deklaratywny i deklaratywny. Operacje LINQ to dobre przykłady.
  • Używaj niezmiennych kolekcji lub zbiorów zmiennych w niezmienny sposób. Dzięki introduction of C# immutable collections powinno być łatwiej niż kiedykolwiek wcześniej.

Zdjęcie powyżej pochodzi z F# for fun and profit z Porting from C# to F# series. Są bardzo pomocni; wiedza, w jaki sposób wyrażenia C# są wyrażone w F #, poprawi użyteczność twojej biblioteki.

Trudno jest uniknąć obiektowych funkcji C#. Pamiętaj, że wnioskowanie typu F # nie działa dobrze z tymi funkcjami. W miarę prostego utrzymywania hierarchii obiektów należy zmniejszyć liczbę przeciążeń elementów. Duża liczba przeciążeń członków może zmylić kontroler typu F #. Co więcej, nie zaszkodzi rozprowadzić cienkie opakowanie F # z biblioteką C#. Pewne rzeczy, które musisz zrobić, to przekształcenie niektórych metod w funkcje modułu i utworzenie Active Patterns w celu rozłożenia hierarchii obiektów.

+0

+1 @pad; optymalne potwierdzenia i doskonałe dalsze wyjaśnienia; to odpowiada dokładnie na moje pytanie, które może być również wyrażone jako: "jak modelować kod C# w sposób przyjazny dla F?" dostarczone artykuły uzupełniają obraz. podsumowując, możemy dodać, że _immutability_ jest głównym tematem, ponieważ "zatrzymuje" efekty uboczne. – jay

+0

Cała strona http://fsharpforfunandprofit.com jest doskonałym źródłem, odkryłem ją dopiero wczoraj. – Benjol

+0

@pad, naprawdę doskonałe (nie wiedziałem)! Znalazłem tu również [to pytanie] (http://stackoverflow.com/questions/1817248/patterns-to-mix-f-and-c-sharp-in-the-same-solution) w taki sam sposób, jak ten temat (opublikowano w celach informacyjnych). – jay

4

Współdziałanie z istniejącymi bibliotekami .NET było głównym celem projektu F #, więc nie ma żadnych ograniczeń dotyczących bibliotek, które należy zużyć.

To powiedziawszy, ze względu na ostrzejsze pisanie F #, istnieją pewne wzory, które powodują nieco bardziej poślizgnięty kod. Wzór budowniczy to jeden.

var bldr = new StringBuilder(); 
bldr.Append("abc"); //ignoring return value 

vs.

bldr.Append("abc") |> ignore //must be explicitly ignored 

Ale to łatwo obejść stosując metodę rozszerzenia lub funkcję niech związany. Konkluzja: współdziałanie to jedna z mocnych stron i największych osiągnięć F #.

+0

+1 na przykład @Daniel; kiedy mówisz o metodzie rozszerzenia, masz na myśli coś, co zwraca 'void/Unit'', sposób uniknięcia potokowania do' 'ignore''? – jay

+0

Dobrze .......... – Daniel