F # pochodzi z OCaml, ale jakich głównych elementów brakuje lub które zostały dodane? W szczególności jestem ciekawy, czy zasoby dostępne do nauki OCaml są również przydatne dla kogoś, kto chce nauczyć się F #.
F # pochodzi z OCaml, ale jakich głównych elementów brakuje lub które zostały dodane? W szczególności jestem ciekawy, czy zasoby dostępne do nauki OCaml są również przydatne dla kogoś, kto chce nauczyć się F #.
Odpowiedzi:
Główne różnice polegają na tym, że język F # nie obsługuje:
Ponadto język F # ma inną składnię dla parametrów z etykietą i parametrów opcjonalnych.
Teoretycznie programy OCaml, które nie używają tych funkcji, można skompilować za pomocą F #. Nauka OCaml to całkiem rozsądne wprowadzenie do języka F # (i odwrotnie, wyobrażam sobie).
Pełna lista różnic znajduje się tutaj (uwaga: zastąpienie nieaktualnego linku w archive.org).
Na to pytanie odpowiadano już od jakiegoś czasu, ale byłem dość zaskoczony, że większość odpowiedzi mówi, jakich funkcji OCaml brakuje w F # - zdecydowanie dobrze jest wiedzieć, jeśli chcesz przenieść istniejące programy OCaml do F # (co jest prawdopodobnie motywacja większości przywoływanych artykułów). Istnieje jednak wiele funkcji, które sprawiają, że F # jest innym językiem (nie tylko ograniczoną wersją OCaml dla .NET!) Oto kilka rzeczy, które zostały dodane w F #:
+
dla wszystkich typów liczbowych, a także typów, które go obsługują.I szczerze, myślę, że warto wspomnieć również o Visual Studio IDE. To nie jest część języka, ale naprawdę poprawia wrażenia użytkownika (obsługa IntelliSense w programie Visual Studio jest naprawdę dobra!)
Jeśli spojrzysz na listę, jest wiele rzeczy, które w dużej mierze przyczyniły się do popularności F #, więc jest to znacznie więcej niż tylko „OCaml bez funktorów”. F # jest zdecydowanie oparty na OCaml (i czerpie pomysły z innych języków, takich jak Haskell) i dzieli z nimi wiele aspektów, ale jest też wiele innych rzeczy. Wydaje mi się, że bez takich rzeczy jak asynchroniczne przepływy pracy, OO w stylu .NET i metaprogramowanie, dział deweloperów Microsoft nigdy nie uwzględniłby F # w Visual Studio 2010.
<@ a @>
, nie mówiąc już o definicjach typów, takich jak <@ type t = int @>
i nie może obsługiwać dowolnych gramatyki, znacznie mniej rozszerzalnych lekserów i parserów, jak robi to Camlp4. Brak przyzwoitego systemu makr to jedna z wad, ale IMHO, brak jakichkolwiek przyzwoitych lekserów i parserów dla F # jest znacznie poważniejszym utrudnieniem. Właściwie radzę programistom, aby tworzyli swoje leksery i parsery za pomocą OCaml, ograniczając się do podzbioru obsługiwanego przez F # i przenosząc go z powrotem do F #, aby skorzystać z doskonałej obsługi narzędzi OCaml!
Zawsze opisuję F # jako kuzyna OCaml, ponieważ OCaml ma wiele funkcji, których F # nie ma i nigdy nie będzie. F # jest ściślej powiązany z poprzednim językiem CAML. W szczególności F # ma bardzo ograniczone wsparcie dla abstrakcji i nie obsługuje w ogóle typowania strukturalnego (jak obiekty OCaml i warianty polimorficzne ).
W przeciwieństwie do tego, co napisali niektórzy respondenci, język F # obsługuje (ograniczone) argumenty oznaczone („nazwane”) i opcjonalne.
Są to jednak wszystkie zaawansowane funkcje iz pewnością możesz zacząć zajmować się podstawowymi pomysłami związanymi z programowaniem funkcjonalnym w stylu OCaml na małą skalę, korzystając z zasobów dotyczących OCaml. Pierwszą istotną różnicą, którą odkryjesz, są problemy na większą skalę, takie jak hermetyzacja i abstrakcja, które są rozwiązywane na zupełnie inne sposoby w OCaml i F #. Jeśli chcesz dowiedzieć się, jak to zrobić w F #, jedyną dostępną literaturą jest ten artykuł o czysto funkcjonalnych strukturach danych .
Odkryłem również, że wspaniały system modułów OCaml ułatwia parametryzację kodu według typów (takich jak struktury danych), ale alternatywy OOP są nie tylko ohydne, ale prawie całkowicie nieużywane w .NET. Co więcej, próbując pisać elegancko sparametryzowane struktury danych, natrafiłem na dziesiątki błędów w kompilatorze F #, ponieważ nikt wcześniej nawet nie próbował tego zrobić. F # stdlib zawiera kilka ładnych implementacji struktur danych, ale praktycznie nie ma możliwości ponownego użycia, tj. Jest to zadanie wycinania i wklejania.
F # i OCaml są taksonimicznie klasami w rodzinie języków ML, która obejmuje również całą gamę innych dziwnych zwierząt. F # jest nowszy niż OCaml i nie ma jeszcze ani funktorów [funkcji modułu -> moduł], ani typów wierszy [klas obiektów i wariantów polimorficznych]. Pomiędzy nimi te dwa uproszczenia prawdopodobnie ułatwiają naukę komuś, kto tworzy program na platformie .Net. Niestety, te dwie funkcje językowe są niezwykle potężne w OCaml, więc czytanie literatury OCaml w celu uzyskania wglądu w kodowanie dla F # prawdopodobnie doprowadzi do przedwczesnej frustracji z tym drugim, gdy jest to prawdopodobnie doskonała alternatywa dla C #, gdzie oba są dostępne.
F # obsługuje bezpośrednio składnię OCaml. Może nie jest w 100% kompatybilny, ale myślę, że jest całkiem blisko.
http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html
Oto lista różnic (nie wiem, jak aktualna jest)
http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html