F # зміни до OCaml [закрито]


126

F # походить від OCaml, але які основні елементи відсутні або додані? Конкретно мені цікаво, чи доступні ресурси для вивчення OCaml також корисні тим, хто хоче вивчити F #.


3
Ще одне порівняння з точки зору розробника OCaml, тому воно досить упереджене, але корисне.
Маурісіо Шеффер

8
Увага: якщо вас цікавить доля цього питання, будь ласка, приєднайтесь до дискусії про Meta Stack Overflow або обговоріть її у чаті - коментарі тут були надзвичайно непродуктивними, тому я їх видалив.
Shog9

1
@MauricioScheffer Несправне посилання!
JD

2
@JonHarrop Я думаю, що це посилання може бути оновленим. (За Кейко Наката)
Барт

Відповіді:


89

Основні відмінності полягають у тому, що F # не підтримує:

  • функтори
  • Об'єкти в стилі OCaml
  • поліморфні варіанти
  • препроцесор або точки розширення camlp4 / 5 (ppx)

Крім того, F # має різний синтаксис для мічених та необов'язкових параметрів.

Теоретично програми OCaml, які не використовують ці функції, можна компілювати з F #. Навчання OCaml - це цілком розумне вступ до F # (і, навпаки, я можу уявити).

Повний перелік відмінностей тут (примітка: архів.org заміна мертвого посилання).


3
Чи є еквівалент camlp4 для F #?
nlucaroni

Не думай так. Але ви можете передавати свою програму через camlp4 і, можливо, у компілятор F #. (Не рекомендував би це.)
Кріс Конвей

6
F # має іменні та необов'язкові аргументи, але він використовує інший синтаксис та семантику. У вас виникнуть проблеми з використанням Camlp4 з F #, оскільки F # майже завжди чутливий до відступу, тому йому знадобиться новий лексер, а документація Camlp4 на лексери залишається неписаною майже два роки.
JD

4
А тепер посилання мертва. Я гадаю, що це, мабуть, добре. Я впевнений, що F # покращився з08 року.

1
Десь я чув, що Microsoft не хоче додавати функцію, схожу на camlp4, до F #, оскільки переживає, що така функціональність може спонукати людей почати користуватися іншими розробними середовищами, ніж Microsoft Visual Studio.
chrismamo1

118

На це питання вже давно відповідали, але я був дуже здивований, що більшість відповідей говорять про відсутність функцій OCaml у F # - це, безумовно, добре знати, чи хочете ви перенести існуючі програми OCaml до F # (що, мабуть, є мотивація більшості посилань на статті). Однак є багато функцій, які роблять F # іншою мовою (не лише обмеженою версією OCaml для .NET!) Ось кілька речей, які додаються у F #:

  • Одиниці вимірювання, які дозволяють набрати код перевірки, що стосується числових обчислень
  • Метапрограмування з використанням цитат (що дає можливість використовувати LINQ у F #, а також є важливим для перспективних проектів, таких як платформа WebSharper)
  • Активні шаблони для створення абстракцій для функціональних типів даних (і, як правило, дуже корисна функція для більш складних додатків відповідності шаблонів)
  • Обчислення виразів, що є мовною особливістю асинхронних робочих процесів (бібліотека для асинхронного вводу / виводу / веб-сервісу / програмування графічного інтерфейсу)
  • Сумісна об’єктна система .NET, яка дозволяє повністю взаємодіяти з платформою .NET (OCaml також має підтримку об'єктів, але різні - звичайно, в обох системах є певні переваги).
  • Перевантажені оператори - Наскільки я знаю, OCaml не має перевантажених операторів - у F # ви можете використовувати +для всіх числових типів, а також для своїх типів, які його підтримують.

І, чесно кажучи, я вважаю, що також варто згадати Visual Studio IDE. Це не є частиною мови, але це дійсно покращує користувацький досвід (підтримка IntelliSense у Visual Studio - це дуже добре!)

Якщо подивитися на список, є багато речей, які значною мірою сприяли популярності F #, тому це набагато більше, ніж просто "OCaml без функторів". F #, безумовно, заснований на OCaml (і бере ідеї з інших мов, таких як Haskell), і ділиться з ними багатьма аспектами, проте є й багато іншого. Я здогадуюсь, що без таких речей, як асинхронні робочі процеси, OO-стиль у стилі .NET та метапрограмування, відділ розробників Microsoft ніколи не включатиме F # у Visual Studio 2010.


18
Вуха! OCaml був спеціально розведений для метапрограмування, що в цьому контексті значно перевершує F # і .NET. Camlp4 - набагато більш потужна система котирування, ніж F #. Лексеми та аналізатори OCaml набагато кращі за все, що доступно для .NET. Також доступні макроси Camlp4, які реалізують активні шаблони та вирази обчислень. OCaml також має IDE, які надають ті самі переваги, що і Visual Studio для F #.
JD

4
Цитати F # мають зовсім іншу мету, ніж ті, що доступні в Camlp4, хоча (окрім цього, це не мова OCaml - це система на вершині), тому їх нечесно порівнювати. Існування Camlp4, безумовно, є перевагою OCaml, але це не має нічого спільного з цитатами (які дозволяють такі речі, як WebSharper, запуск F # на GPU тощо)
Томаш Петричек

12
@Tomas: Як ви узгоджуєте свою заяву про те, що Camlp4 "- це система на вершині" OCaml, коли Camlp4 інтегрований з OCaml на бінарному рівні, а макроси Camlp4 можна визначити та використовувати під час роботи під керуванням OCaml REPL? Як ви узгоджуєте своє твердження, що Camlp4 "не має нічого спільного з цитатами" з тим, що Camlp4 забезпечує механізм котирування? Як ви узгоджуєте свою думку про те, що Camlp4 не може полегшити подібність Websharper, коли інструмент ocamljs SkyDeck збирає код OCaml, котируваний за допомогою Camlp4 в Javascript з 2007 року?
JD

6
@Tomas: F # не може навіть цитувати вирази з незв’язаними змінними, як <@ a @>, наприклад , визначення типів типу, <@ type t = int @>і він не може обробляти довільні граматики набагато менш розширювані лексеми та аналізатори, як це робить Camlp4. Відсутність гідної макросистеми - це один недолік, але, IMHO, відсутність будь-яких гідних лексерів та аналізаторів для F # є набагато серйознішою перешкодою. Я фактично раджу розробникам створювати свої лексеми та парсери за допомогою OCaml, обмежуючи себе підмножиною, яке F # підтримує, і переносить його на F #, щоб отримати перевагу від покращеної підтримки інструментів OCaml!
JD

8
@Erik: "Більшість людей зосереджуються на тому, чого не вистачає в F #, але я також хотів побачити, чого не вистачає в OCaml". Зауважте, що активні шаблони, метапрограмування, обчислювальні вирази та асинхронні робочі процеси були доступні в OCaml ще до того, як вони перетворили його на F #.
JD

16

Я завжди описую F # як двоюрідного брата OCaml, оскільки OCaml має багато функцій, яких F # не має і ніколи не може отримати. F # більш тісно пов'язаний з попередньою мовою CAML. Зокрема, F # має дуже обмежену підтримку абстракції і взагалі не підтримує структурну типізацію (як об'єкти OCaml та поліморфні варіанти ).

На відміну від того, що написали деякі респонденти, у F # є (обмежена) підтримка мічених ("названих") та необов'язкових аргументів.

Однак, це все розширені функції, і ви, звичайно, можете почати знайомитися з основними ідеями, що стоять за дрібномасштабним функціональним програмуванням в стилі OCaml, використовуючи ресурси про OCaml. Перша основна відмінність, яку ви виявите, - це такі масштабні проблеми, як інкапсуляція та абстракція, які вирішуються абсолютно різними способами в OCaml та F #. Якщо ви хочете дізнатися, як це зробити у F #, єдиною доступною літературою є ця стаття про суто функціональні структури даних .

Я також виявив, що чудова модульна система OCaml спрощує параметризацію коду за типами (наприклад, структурами даних), але альтернативи OOP не тільки огидні, але майже повністю не використовуються в .NET. Більше того, намагаючись записати елегантно параметризовані структури даних, я потрапив у компілятор F # на десятки помилок, оскільки ніхто раніше навіть не намагався цього зробити. F # stdlib містить кілька приємних реалізацій структури даних, але практично не використовується повторно, тобто це завдання cut'n'paste.


28
Усі посилання вимагають платні підписки.

2
@ Чи будуть вони здаватися безсоромними плагінами для речей, які сам писав Джон Харроп (він щоразу вказаний як автор)
симбіонт

@symbiont Так, ми знаємо, це трохи спам. Було б добре, якби ви зв’язали якусь додаткову інформацію, яка була безкоштовною. Але відповідь прекрасна без посилань, так що ти там.

@ Було б добре, якби ви самі зв’язали якусь додаткову інформацію
симбіонта

@symbiont Я мав на увазі Джона, а не ти, коли я сказав "ти". Звучить дивно, читаючи це. Не впевнений, чи видалив Джон проміжний коментар. Так чи інакше: Meta Stack Exchange

9

F # і OCaml - таксонімічно класи в сімействі мов ML, куди також входить цілий перелік інших дивних тварин. F # є більш новим, ніж OCaml, і він ще не має ані функторів [функції модуля -> модуля], ані типів рядків [об’єктні класи та поліморфні варіанти]. Між ними ці два спрощення, ймовірно, полегшують криву навчання для тих, хто розвивається на платформі .Net. На жаль, ці дві мовні особливості є надзвичайно потужними в OCaml, тому читання літератури OCaml для отримання розуміння того, як кодувати F #, ймовірно, призведе до передчасного розладу з останнім, коли це, мабуть, відмінна альтернатива C #, де обидва доступні.


2

F # підтримує синтаксис OCaml безпосередньо. Це може бути не на 100% сумісним, але я думаю, що це досить близько.

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

Ось список відмінностей (не впевнений, наскільки це актуально)

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html


1
"F # підтримує синтаксис OCaml безпосередньо. Це може бути не 100% сумісним, але я думаю, що він досить близький". IME підтримка компілятора F # для сумісності з OCaml дуже помилкова. Це може ускладнити перенесення існуючих баз коду OCaml до F #, оскільки компілятор F # внутрішньо гине на дійсному коді.
JD

Усі посилання мертві.
Wingjam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.