Quais são as diferenças entre SML e OCaml? [fechadas]

Respostas:

157

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 Listfunçõ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 tyfor 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 .

Norman Ramsey
fonte
4
Você esqueceu a igualdade (irrestrita e insegura em OCaml vs tipos de igualdade segura, mas restrita em SML), variáveis ​​de tipo não generalizadas ('_a em OCaml), printf, interpretação de nomes de arquivo como nomes de módulo em OCaml, muito mais currying em stdlib de OCaml. Você escreveu interface duas vezes quando queria dizer outra coisa (implementação?) Na segunda vez.
JD
1
e padrões de or e protetores de OCaml em casamento de padrões.
JD
1
Observe que a limitação da utilidade das anotações de tipo foi um pouco atenuada no 3.12, onde a anotação e : 'a . ty(a)é possível e significativa.
4
Você faz a observação importante: "A biblioteca Caml é muito imperativa". Isso parece permear toda a filosofia, até o ponto em que a implementação paralela em hardware multicore parece ser muito difícil ou impossível. Em contraste, existem pelo menos dois SMLs paralelos: Mlton e Poly / ML.
Makarius,
2
Sobre o terceiro ponto, os nomes dos registros não exigem mais exclusividade no OCaml.
PatJ
-3

OCaml adiciona recursos de orientação a objetos e tem algumas pequenas diferenças de sintaxe.

Charlie Martin
fonte