Jakie są korzyści z używania C # vs F # czy F # vs C#? [zamknięte]

Pracuję dla firmy technologicznej, która zajmuje się bardziej prototypowaniem niż wysyłką produktów. Właśnie zapytano mnie jaka jest różnica między C# A F#, dlaczego MS stworzył F# i jakie scenariusze byłyby lepsze od C#.

Używam języka od jakiegoś czasu i uwielbiam go, więc mogę łatwo przejść o wspaniałych cechach F# jednak brakuje mi doświadczenia w C#, aby powiedzieć, dlaczego powinniśmy używać jednego nad drugim.

Jakie są korzyści z używania C # vs F # czy F # vs C#?

 93
Author: casperOne, 2009-06-04

8 answers

Ogólne korzyści programowania funkcyjnego nad językami imperatywnymi:

Możesz sformułować wiele problemów znacznie łatwiej, bliżej ich definicji i bardziej zwięźle w funkcyjnym języku programowania, takim jak F# , a Twój kod jest mniej podatny na błędy (niezmienność, potężniejszy system typów, intuicyjne algorytmy rekurencyjne). Możesz kodować to, co masz na myśli, zamiast tego, co komputer chce, abyś powiedział; -) znajdziesz wiele takich dyskusji, gdy wygooglujesz je lub nawet wyszukasz na Więc.

Specjalne F# - zalety:

  • Programowanie asynchroniczne jest niezwykle proste i intuicyjne z async {}-wyrażenia - nawet z ParallelFX, odpowiadający im kod C#jest znacznie większy

  • Bardzo łatwa integracja kompilatorów i języków specyficznych dla domeny

  • Rozszerzanie języka według potrzeb: LOP

  • Jednostki miary

  • Więcej elastyczna składnia

  • Często krótsze i bardziej eleganckie rozwiązania

Spójrz na ten dokument

[1]}zaletą C # jest to, że często jest on dokładniejszy do "imperatywnych"aplikacji (interfejs użytkownika, algorytmy imperatywne) niż funkcjonalny język programowania. NET-Framework, którego używa, jest imperatywnie zaprojektowany i bardziej rozpowszechniony.

Ponadto możesz mieć F # I C# razem w jednym rozwiązaniu, dzięki czemu możesz połączyć korzyści płynące z obu języków i używać ich tam, gdzie są potrzebne.

 86
Author: Dario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 19:06:09

To jak pytanie, jakie korzyści daje młotek nad śrubokrętem. Na bardzo wysokim poziomie, oba zasadniczo robią to samo, ale na poziomie wdrożenia ważne jest, aby wybrać optymalne narzędzie do tego, co próbujesz osiągnąć. Istnieją zadania, które są trudne i czasochłonne w c#, ale łatwe w f# - jak próba wbicia gwoździa śrubokrętem. Możesz to zrobić, na pewno - to nie jest idealne.

Manipulacja danymi to jeden z przykładów, który mogę osobiście wskazać, gdzie f # naprawdę świeci, A c# może być potencjalnie nieporęczne. Z drugiej strony powiedziałbym (ogólnie rzecz biorąc), że złożony stateful UI jest łatwiejszy w OO (c#) niż funkcjonalny (f#). (Pewnie byliby ludzie, którzy się z tym nie zgadzają, ponieważ "fajnie" jest teraz "udowodnić", jak łatwo jest zrobić cokolwiek W F#, ale popieram). Jest wiele innych.

 36
Author: Rex M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 18:38:22
  • F # ma lepszą wydajność niż C# w matematyce
  • możesz użyć projektów F# w tym samym rozwiązaniu z C# (i wywołać od jednego do drugiego)
  • F # jest naprawdę dobry do skomplikowanego programowania algorytmicznego, zastosowań finansowych i naukowych
  • F# logicznie jest naprawdę dobry do wykonywania równoległego (łatwiej jest wykonać kod F# na rdzeniach równoległych, niż C#)
 27
Author: Rinat Abdullin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 18:37:35

Aby odpowiedzieć na twoje pytanie, Jak to rozumiem: po co używać C#? (Mówisz, że jesteś już sprzedany na F#.)

Po pierwsze. To nie tylko "funkcjonalne kontra OO". To "funkcjonalne + OO kontra OO". Funkcje C#są dość prymitywne. F # ' S nie są. Tymczasem F # wykonuje prawie wszystkie funkcje oo C#. W większości przypadków f# kończy się jako superset funkcjonalności C#.

Jest jednak kilka przypadków, w których F# może nie być najlepszym wyborem:

  • Interop. Są mnóstwo bibliotek, które po prostu nie będą zbyt wygodne od F#. Może wykorzystują pewne rzeczy C # OO, które F# nie robią tego samego, a może opierają się na wewnętrznych elementach kompilatora C#. Na przykład wyrażenie. Chociaż można łatwo przekształcić notację F# W wyrażenie, wynik nie zawsze jest dokładnie taki, jaki stworzyłby C#. Niektóre biblioteki mają z tym problem.

    • Tak, interop jest dość dużą siecią i może powodować tarcie z niektórymi bibliotekami.

    • Uważam, że interop obejmuje również, jeśli masz dużą istniejącą bazę kodową. To może nie mieć sensu, aby po prostu zacząć pisać części W F#.

  • Narzędzia do projektowania. F# nie ma żadnych. Nie oznacza to, że nie może mieć żadnych, ale w tej chwili nie możesz uruchomić aplikacji WinForms z F # codebehind. Nawet tam, gdzie jest to obsługiwane, jak na stronach ASPX, nie masz obecnie IntelliSense. Musisz więc dokładnie rozważyć, gdzie będą twoje granice dla wygenerowanego kodu. Na naprawdę małym projekcie, który prawie wyłącznie korzysta z różnych projektantów, może nie warto używać F # do "kleju" lub logiki. W przypadku większych projektów może to stać się mniej problemem.

    • To nie jest wewnętrzny problem. W przeciwieństwie do odpowiedzi Rexa M, nie widzę w C# czy F# nic, co sprawiłoby, że lepiej byłoby zrobić UI z dużą ilością zmiennych pól. Może odnosił się do dodatkowych kosztów związanych z koniecznością pisania "mutable" i używania

    • Zależy również od używanej biblioteki / projektanta. Kochamy używać ASP.NET MVC z F # dla wszystkich kontrolerów, następnie Projekt C # web, aby uzyskać projektantów ASPX. Mieszamy rzeczywisty "kod ASPX inline" pomiędzy C# i F#, w zależności od tego, czego potrzebujemy na tej stronie. (IntelliSense kontra typy F#.)

  • Inne narzędzia. Mogą po prostu oczekiwać tylko C# i nie wiedzą, jak radzić sobie z projektami F# lub skompilowanym kodem. Również biblioteki F#nie wysyłają w ramach . NET, więc masz trochę więcej do wysłania.

  • Ale Numer jeden? Osób. Jeśli żaden z Twoich programistów nie chce się uczyć F#, lub co gorsza, ma poważne trudności ze zrozumieniem pewnych aspektów, to prawdopodobnie jesteś już gotowy. (Chociaż i tak bym się upiekł. Jeśli kierownictwo odmówi, to może być problem.

Pisałem o tym jakiś czas temu: dlaczego nie F#?

 27
Author: MichaelGG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-10 03:13:43

Prosisz o porównanie między językiem proceduralnym a językiem funkcyjnym, więc mam wrażenie, że na twoje pytanie można odpowiedzieć tutaj: Jaka jest różnica między programowaniem proceduralnym a funkcyjnym?

Dlaczego MS stworzył F# odpowiedź brzmi po prostu: stworzenie języka funkcjonalnego z dostępem do biblioteki. Net po prostu rozszerzyło swoją bazę rynkową. I widząc, jak składnia jest prawie identyczna z OCaml, to naprawdę nie wymagało wiele wysiłku na ich część.

 6
Author: Spencer Ruport,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:19

F # nie jest jeszcze-innym - językiem-programowania, jeśli porównujesz go do C#, C++, VB. C#, C, VB to wszystkie imperatywne lub proceduralne języki programowania. F # jest funkcjonalnym językiem programowania.

Dwie główne zalety funkcjonalnych języków programowania (w porównaniu do języków imperatywnych) to 1. że nie mają skutków ubocznych. To sprawia, że matematyczne rozumowanie o właściwościach Twojego programu jest o wiele łatwiejsze. 2. że funkcje są obywatelami pierwszej klasy. Możesz przekazać funkcje jako parametry do innych funkcji równie łatwo, jak można inne wartości.

Zarówno imperatywne, jak i funkcjonalne języki programowania mają swoje zastosowania. Chociaż nie wykonałem jeszcze żadnej poważnej pracy W F#, obecnie wdrażamy komponent scheduling w jednym z naszych produktów opartych na C# i zamierzamy przeprowadzić eksperyment, kodując ten sam scheduler W F#, aby sprawdzić, czy poprawność implementacji może być łatwiej zweryfikowana niż w przypadku odpowiednika C#.

 5
Author: Jeroen Huinink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 18:46:04

F # jest zasadniczo C++ funkcyjnych języków programowania. Trzymali prawie wszystko z obiektywnego Caml, w tym naprawdę głupie części, i wrzucili go na wierzch. NET runtime w taki sposób, że przynosi wszystkie złe rzeczy z.NET, jak również.

Na przykład, z Objective Caml otrzymujesz jeden typ null, opcję. Z F# otrzymujesz trzy typy null, option, Nullable i reference null. Oznacza to, że jeśli masz opcję, musisz najpierw sprawdzić, czy jest to "None", następnie musisz sprawdzić, czy jest to " Some(null)".

F # jest jak stary Klon Javy J#, tylko po to, by przyciągnąć uwagę. Niektórym się spodoba, kilku z nich nawet go użyje, ale w końcu jest to wciąż 20-letni język, który został przyczepiony do CLR.

 5
Author: Jonathan Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 16:59:31

Jednym z aspektów. NET, który lubię najbardziej, są generyki. Nawet jeśli piszesz kod proceduralny W F#, nadal będziesz korzystać z wnioskowania typu. Ułatwia pisanie kodu generycznego.

W C# domyślnie piszesz konkretny kod i musisz włożyć trochę dodatkowej pracy, aby napisać kod generyczny.

W F# domyślnie piszesz kod ogólny. Po spędzeniu ponad roku programowania zarówno w F#, jak i C#, stwierdzam, że kod biblioteki, który piszę w F# jest zarówno bardziej zwięzły, jak i bardziej ogólny niż kod, który piszę w C#, a więc jest bardziej wielokrotnego użytku. Brakuje mi wielu możliwości pisania kodu generycznego w C#, prawdopodobnie dlatego, że oślepiają mnie obowiązkowe adnotacje typu.

Są jednak sytuacje, w których używanie C# jest preferowane, w zależności od gustu i stylu programowania.

  • C# nie narzuca kolejności deklaracji między typami i nie jest wrażliwy na kolejność, w jakiej pliki są kompilowane.
  • C # ma pewne niejawne konwersje, których F # nie może stać ze względu na typ wnioskowania.
 5
Author: Joh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 18:41:53