F # zmiany w OCaml [zamknięte]

126

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

Erik Forbes
źródło
3
Kolejne porównanie z perspektywy programisty OCaml, więc jest dość stronnicze, ale mimo to przydatne.
Mauricio Scheffer
8
Uwaga: jeśli interesuje was los tego pytania, dołączcie do dyskusji na temat Meta Stack Overflow lub przedyskutujcie to na czacie - komentarze tutaj były wyjątkowo bezproduktywne, więc je usunąłem.
Shog9
1
@MauricioScheffer Zepsuty link!
JD
2
@JonHarrop Myślę, że ten link może być zaktualizowany. (Keiko Nakata)
Bart

Odpowiedzi:

89

Główne różnice polegają na tym, że język F # nie obsługuje:

  • funktory
  • Obiekty w stylu OCaml
  • warianty polimorficzne
  • preprocesor lub punkty rozszerzeń camlp4 / 5 (ppx)

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

Chris Conway
źródło
3
Czy istnieje odpowiednik camlp4 dla języka F #?
nlucaroni
Nie myśl tak. Ale prawdopodobnie możesz przesłać swój program przez camlp4 do kompilatora F #. (Nie poleciłbym tego.)
Chris Conway,
6
F # ma nazwane i opcjonalne argumenty, ale używa innej składni i semantyki. Będziesz miał problemy z używaniem Camlp4 z F #, ponieważ F # prawie zawsze jest wrażliwy na wcięcia, więc będzie potrzebował nowego leksera, a dokumentacja Camlp4 na temat lekserów pozostała niepisana przez prawie dwa lata.
JD
4
A teraz łącze nie działa. Przypuszczam, że to prawdopodobnie dobre. Jestem pewien, że F # został ulepszony od '08.
1
Słyszałem gdzieś, że Microsoft nie chce dodawać funkcjonalności podobnej do camlp4 do F #, ponieważ obawiali się, że taka funkcjonalność może zachęcić ludzi do korzystania ze środowisk programistycznych innych niż Microsoft Visual Studio.
chrismamo1
118

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 #:

  • Jednostki miary, które pozwalają na sprawdzanie kodu typu podczas obliczeń numerycznych
  • Metaprogramowanie za pomocą cytatów (co umożliwia użycie LINQ w F # i jest również niezbędne do obiecujących projektów, takich jak platforma WebSharper)
  • Aktywne wzorce do tworzenia abstrakcji dla funkcjonalnych typów danych (i ogólnie bardzo przydatna funkcja dla bardziej skomplikowanych aplikacji dopasowywania wzorców)
  • Wyrażenia obliczeniowe, które są funkcją językową związaną z asynchronicznymi przepływami pracy (biblioteka do asynchronicznego we / wy / usługi sieciowej / programowania GUI)
  • System obiektowy zgodny z .NET który umożliwia pełną współpracę z platformą .NET (OCaml ma również wsparcie dla obiektów, ale inne - są oczywiście pewne korzyści w obu systemach).
  • Przeciążone operatory - O ile wiem, OCaml nie ma przeciążonych operatorów - w języku F # można używać +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.

Tomas Petricek
źródło
18
Woah! OCaml został specjalnie wyhodowany do metaprogramowania, w tym kontekście znacznie przewyższa F # i .NET. Camlp4 to znacznie potężniejszy system notowań niż F #. Leksery i parsery OCaml są o wiele lepsze niż cokolwiek dostępne dla .NET. Dostępne są również makra Camlp4, które implementują aktywne wzorce i wyrażenia obliczeniowe. OCaml ma również środowiska IDE, które zapewniają te same korzyści, co program Visual Studio dla języka F #.
JD
4
Cytaty F # mają jednak zupełnie inny cel niż to, co jest dostępne w Camlp4 (poza tym nie jest to język OCaml - to system na jego szczycie), więc porównywanie ich nie jest sprawiedliwe. Istnienie Camlp4 jest z pewnością zaletą OCaml, ale nie ma to nic wspólnego z cytatami (które pozwalają na takie rzeczy jak WebSharper, uruchamianie F # na GPU itp.)
Tomas Petricek
12
@Tomas: Jak pogodzić się z twierdzeniem, że Camlp4 "jest systemem na szczycie" OCaml, skoro Camlp4 jest zintegrowany z OCaml na poziomie binarnym, a makra Camlp4 mogą być definiowane i używane "w locie" w działającym OCaml REPL? Jak pogodzić twierdzenie, że Camlp4 „nie ma nic wspólnego z notowaniami” z faktem, że Camlp4 zapewnia mechanizm kwotowania? Jak pogodzić swoje sugestie, że Camlp4 nie może ułatwić takich rozwiązań jak Websharper, skoro narzędzie ocamljs firmy SkyDeck kompiluje kod OCaml cytowany przy użyciu Camlp4 do Javascript od 2007 roku?
JD
6
@Tomas: F # nie może nawet cytować wyrażeń z niezwiązanymi zmiennymi <@ 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!
JD
8
@Erik: „Większość ludzi skupia się na tym, czego brakuje w F #, ale chciałem też zobaczyć, czego brakuje w OCaml”. Zauważ, że aktywne wzorce, metaprogramowanie, wyrażenia obliczeń i asynchroniczne przepływy pracy były dostępne w OCaml, zanim zostały wprowadzone do F #.
JD
16

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.

JD
źródło
28
Wszystkie linki wymagają płatnej subskrypcji.
2
@Czy wydają się bezwstydną wtyczką do rzeczy, które sam napisał Jon Harrop (za każdym razem jest wymieniony jako autor)
symbiont
@symbiont Tak, wiemy, że to trochę spamerskie. Byłoby miło, gdybyś podał link do dodatkowych informacji, które są bezpłatne. Ale odpowiedź jest dobra bez linków, więc oto jesteś.
@ Byłoby miło, gdybyś sam podał link do dodatkowych informacji
symbiont
@symbiont Kiedy powiedziałem „ty”, miałem na myśli jon, a nie ciebie. Brzmi dziwnie, czytając to. Nie jestem pewien, czy Jon usunął pełnoekranowy komentarz. Tak czy inaczej, proszę bardzo: Meta Stack Exchange
9

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.

James Woodyatt
źródło
2

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

Lou Franco
źródło
1
„F # obsługuje bezpośrednio składnię OCaml. Może nie być w 100% zgodna, ale myślę, że jest całkiem blisko”. IME Wsparcie kompilatora F # dla zgodności OCaml jest bardzo błędne. Może to utrudnić przeniesienie istniejących baz kodu OCaml do F #, ponieważ kompilator F # umiera wewnętrznie na prawidłowym kodzie.
JD
Wszystkie linki są martwe.
Wingjam