Які відмінності між SML та OCaml? [зачинено]


99

Що відрізняє два діалекти ML?


3
Синтаксичне порівняння: adam.chlipala.net/mlcomp
nawfal

Відповіді:


157

Існує безліч розбіжностей, деякі технічні, деякі соціально-політичні. Я спробував поставити на перший план більш важливі відмінності.

  • SML - це мова з визначенням та стандартом. Він стабільний (і насправді був заморожений, тому не може розвиватися). Ціль Caml - це реалізація, яку контролює невелика група в INRIA. Вона продовжує розвиватися. (ІМО еволюцією керується добре.)

  • SML має багато реалізацій; У Камла є лише один.

  • Об'єктивний Камль має ряд додаткових особливостей, серед яких найбільш помітними є, мабуть, об'єкти та поліморфні варіанти.

  • Дві мови мають різно різні моделі типів записів. Якщо коротко, у Caml назви полів запису повинні бути унікальними, де у SML два різні типи записів у тій самій області можуть мати спільні назви полів. Ця химерність може зробити перенос із SML на Caml дещо складним.

  • Синтаксичних відмінностей досить багато.

  • Бібліотеки та стандартні функції кардинально відрізняються. Бібліотека Caml дуже необхідна, тоді як стандартна бібліотека основ SML є більш функціональною. Наприклад, функціональний склад є примітивом верхнього рівня в SML; це не частина бібліотеки Камля. Бібліотека рядків Caml не забезпечує функцію складання (принаймні, не у версії 3.08). Реалізація багатьох Listфункцій Caml небезпечна для дуже довгих списків; вони видувають стопку.

  • Системи типів тонко відрізняються: у Caml анотація типу на виразі e : tyприймається, якщо тип ty уніфікується з типом e. У SML e : tyприймається лише у тому випадку, якщо тип tyє екземпляром типу e. Ця відмінність робить анотацію в Caml набагато менш корисною на практиці, оскільки неможливо використовувати анотацію типу, щоб наполягати на тому, що вираз є поліморфним.

  • Caml має набагато більш розумний та розумний зв'язок між інтерфейсами (називаються типами модулів або підписами ) та (конкретними) реалізаціями (називаються модулями чи структурами ), ніж SML. У SML майже все йде, і вам доведеться розраховувати на програміста, щоб створити добрі умови. У Камлі компілятор встановлює та застосовує добрі конвенції.

  • У SML арифметичні оператори перевантажені, щоб застосувати як дані з плаваючою комою, так і цілі числа. У Caml оператори не перевантажені; Оператори з плаваючою комою помічені додатковою крапкою.

  • У SML програміст може контролювати пріоритетність та асоціативність операторів інфіксації. У Caml вони визначаються першим символом імені оператора. Це обмеження обмежує переваги можливості визначення вашої власної позначки інфіксації.

Для більш детального аналізу, доповненого редакційним коментарем, ви також можете переглянути сторінку порівняння Адама Хліпала .


4
Ви забули рівність (необмежена і небезпечна в OCaml проти безпечних, але обмежених типів рівності в SML), не узагальнені змінні типу ('_a в OCaml), printf, інтерпретація імен файлів як імен модулів в OCaml, набагато більше, ніж цікаво в stdlib OCaml. Ви написали інтерфейс двічі, коли мали на увазі щось інше (реалізацію?) Вдруге.
JD

1
і OCaml або-шаблони та захисні елементи у відповідності зразками.
JD

1
Зауважимо, що обмеження щодо корисності анотацій типів було дещо зменшено у 3.12, де анотування e : 'a . ty(a)можливе та значне.

4
Ви робите важливе зауваження: "Бібліотека Caml дуже необхідна". Це, мабуть, пронизує всю філософію, аж до того, що паралельна реалізація на багатоядерному обладнанні здається дуже важкою неможливою. На противагу цьому є щонайменше дві паралельні SML: Mlton та Poly / ML.
Макарій

2
Щодо вашого третього пункту, імена записів більше не потребують унікальності в OCaml.
PatJ

31

Докладніше про синтаксичні відмінності, про які згадував Норман Рамзі, ось декілька веб-сторінок:


-3

OCaml додає функції об'єктно-орієнтованої роботи і має деякі незначні синтаксичні відмінності.

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