F # походить від OCaml, але які основні елементи відсутні або додані? Конкретно мені цікаво, чи доступні ресурси для вивчення OCaml також корисні тим, хто хоче вивчити F #.
F # походить від OCaml, але які основні елементи відсутні або додані? Конкретно мені цікаво, чи доступні ресурси для вивчення OCaml також корисні тим, хто хоче вивчити F #.
Відповіді:
Основні відмінності полягають у тому, що F # не підтримує:
Крім того, F # має різний синтаксис для мічених та необов'язкових параметрів.
Теоретично програми OCaml, які не використовують ці функції, можна компілювати з F #. Навчання OCaml - це цілком розумне вступ до F # (і, навпаки, я можу уявити).
Повний перелік відмінностей тут (примітка: архів.org заміна мертвого посилання).
На це питання вже давно відповідали, але я був дуже здивований, що більшість відповідей говорять про відсутність функцій OCaml у F # - це, безумовно, добре знати, чи хочете ви перенести існуючі програми OCaml до F # (що, мабуть, є мотивація більшості посилань на статті). Однак є багато функцій, які роблять F # іншою мовою (не лише обмеженою версією OCaml для .NET!) Ось кілька речей, які додаються у F #:
+
для всіх числових типів, а також для своїх типів, які його підтримують.І, чесно кажучи, я вважаю, що також варто згадати Visual Studio IDE. Це не є частиною мови, але це дійсно покращує користувацький досвід (підтримка IntelliSense у Visual Studio - це дуже добре!)
Якщо подивитися на список, є багато речей, які значною мірою сприяли популярності F #, тому це набагато більше, ніж просто "OCaml без функторів". F #, безумовно, заснований на OCaml (і бере ідеї з інших мов, таких як Haskell), і ділиться з ними багатьма аспектами, проте є й багато іншого. Я здогадуюсь, що без таких речей, як асинхронні робочі процеси, OO-стиль у стилі .NET та метапрограмування, відділ розробників Microsoft ніколи не включатиме F # у Visual Studio 2010.
<@ a @>
, наприклад , визначення типів типу, <@ type t = int @>
і він не може обробляти довільні граматики набагато менш розширювані лексеми та аналізатори, як це робить Camlp4. Відсутність гідної макросистеми - це один недолік, але, IMHO, відсутність будь-яких гідних лексерів та аналізаторів для F # є набагато серйознішою перешкодою. Я фактично раджу розробникам створювати свої лексеми та парсери за допомогою OCaml, обмежуючи себе підмножиною, яке F # підтримує, і переносить його на F #, щоб отримати перевагу від покращеної підтримки інструментів OCaml!
Я завжди описую F # як двоюрідного брата OCaml, оскільки OCaml має багато функцій, яких F # не має і ніколи не може отримати. F # більш тісно пов'язаний з попередньою мовою CAML. Зокрема, F # має дуже обмежену підтримку абстракції і взагалі не підтримує структурну типізацію (як об'єкти OCaml та поліморфні варіанти ).
На відміну від того, що написали деякі респонденти, у F # є (обмежена) підтримка мічених ("названих") та необов'язкових аргументів.
Однак, це все розширені функції, і ви, звичайно, можете почати знайомитися з основними ідеями, що стоять за дрібномасштабним функціональним програмуванням в стилі OCaml, використовуючи ресурси про OCaml. Перша основна відмінність, яку ви виявите, - це такі масштабні проблеми, як інкапсуляція та абстракція, які вирішуються абсолютно різними способами в OCaml та F #. Якщо ви хочете дізнатися, як це зробити у F #, єдиною доступною літературою є ця стаття про суто функціональні структури даних .
Я також виявив, що чудова модульна система OCaml спрощує параметризацію коду за типами (наприклад, структурами даних), але альтернативи OOP не тільки огидні, але майже повністю не використовуються в .NET. Більше того, намагаючись записати елегантно параметризовані структури даних, я потрапив у компілятор F # на десятки помилок, оскільки ніхто раніше навіть не намагався цього зробити. F # stdlib містить кілька приємних реалізацій структури даних, але практично не використовується повторно, тобто це завдання cut'n'paste.
F # і OCaml - таксонімічно класи в сімействі мов ML, куди також входить цілий перелік інших дивних тварин. F # є більш новим, ніж OCaml, і він ще не має ані функторів [функції модуля -> модуля], ані типів рядків [об’єктні класи та поліморфні варіанти]. Між ними ці два спрощення, ймовірно, полегшують криву навчання для тих, хто розвивається на платформі .Net. На жаль, ці дві мовні особливості є надзвичайно потужними в OCaml, тому читання літератури OCaml для отримання розуміння того, як кодувати F #, ймовірно, призведе до передчасного розладу з останнім, коли це, мабуть, відмінна альтернатива C #, де обидва доступні.
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