Respostas:
Existem muitas diferenças, algumas técnicas, algumas sociopolíticas. Tentei colocar as diferenças mais importantes primeiro.
SML é uma linguagem com uma definição e um padrão. É estável (e de fato foi congelado, então não pode evoluir). Objetivo Caml é uma implementação controlada por um pequeno grupo no INRIA. Ele continua a evoluir. (IMO a evolução é bem gerida.)
SML tem muitas implementações; Caml tem apenas um.
Objective Caml tem uma série de recursos adicionais, entre os quais os mais proeminentes são provavelmente objetos e variantes polimórficas.
As duas linguagens têm modelos dramaticamente diferentes de tipos de registro. Resumidamente, em Caml, os nomes dos campos de registro devem ser exclusivos, enquanto no SML, dois tipos de registro diferentes no mesmo escopo podem ter nomes de campo em comum. Essa peculiaridade pode tornar a portabilidade de SML para Caml um pouco complicada.
Existem algumas diferenças sintáticas.
As bibliotecas e funções padrão são dramaticamente diferentes. A biblioteca Caml é muito importante, enquanto a SML Standard Basis Library é mais funcional. Por exemplo, a composição da função é uma primitiva de nível superior em SML; não faz parte da biblioteca Caml. A biblioteca de strings Caml não fornece uma função de dobra (pelo menos não na versão 3.08). Implementações de muitas das List
funções Caml não são seguras para listas muito longas; eles explodem a pilha.
Os sistemas de tipo são sutilmente diferentes: Em Caml, uma anotação de tipo em uma expressão e : ty
é aceita se o tipo se ty
unir ao tipo de e
. No SML, e : ty
é aceito apenas se o tipo ty
for uma instância do tipo de e
. Essa distinção torna a anotação em Caml muito menos útil na prática, porque é impossível usar uma anotação de tipo para insistir que uma expressão é polimórfica.
Caml tem um relacionamento muito mais lógico e sensato entre interfaces (chamadas de tipos de módulos ou assinaturas ) e implementações (concretas) (chamadas de módulos ou estruturas ) do que SML. Em SML, praticamente tudo vale e você tem que contar com o programador para estabelecer boas convenções. No Caml, boas convenções são estabelecidas e aplicadas pelo compilador.
Em SML, os operadores aritméticos são sobrecarregados para serem aplicados a dados de ponto flutuante e inteiros. No Caml, os operadores não ficam sobrecarregados; operadores de ponto flutuante são notados com um ponto extra.
No SML, o programador pode controlar a precedência e a associação de operadores infixos. No Caml, eles são determinados pelo primeiro caractere do nome do operador. Essa restrição limita os benefícios de ser capaz de definir sua própria notação de infixo.
Para uma análise mais detalhada completa com comentários editoriais, você também pode olhar a página de comparação de Adam Chlipala .
e : 'a . ty(a)
é possível e significativa.
Para obter detalhes sobre as diferenças sintáticas mencionadas por Norman Ramsey, aqui estão algumas páginas da web:
OCaml adiciona recursos de orientação a objetos e tem algumas pequenas diferenças de sintaxe.