Відповіді:
Існує безліч розбіжностей, деякі технічні, деякі соціально-політичні. Я спробував поставити на перший план більш важливі відмінності.
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 вони визначаються першим символом імені оператора. Це обмеження обмежує переваги можливості визначення вашої власної позначки інфіксації.
Для більш детального аналізу, доповненого редакційним коментарем, ви також можете переглянути сторінку порівняння Адама Хліпала .
e : 'a . ty(a)
можливе та значне.
Докладніше про синтаксичні відмінності, про які згадував Норман Рамзі, ось декілька веб-сторінок:
OCaml додає функції об'єктно-орієнтованої роботи і має деякі незначні синтаксичні відмінності.