F # muda para OCaml [fechado]

126

O F # é derivado do OCaml, mas quais itens principais estão ausentes ou adicionados? Especificamente, estou curioso para saber se os recursos disponíveis para aprender OCaml também são úteis para quem deseja aprender F #.

Erik Forbes
fonte
3
Outra comparação da perspectiva de um desenvolvedor de OCaml, portanto, é bastante tendenciosa, mas útil, no entanto.
Mauricio Scheffer
8
Atenção: se você está interessado no destino dessa pergunta, participe da discussão sobre o Meta Stack Overflow ou discuta-o no chat - os comentários aqui foram extraordinariamente improdutivos, por isso os removi.
Shog9
1
@MauricioScheffer Link quebrado!
JD
2
@ JonHarrop Acho que esse link pode ser o atualizado. (Por Keiko Nakata)
Bart

Respostas:

89

As principais diferenças são que o F # não suporta:

  • functores
  • Objetos no estilo OCaml
  • variantes polimórficas
  • o pré-processador camlp4 / 5 ou pontos de extensão (ppx)

Além disso, o F # tem uma sintaxe diferente para parâmetros rotulados e opcionais.

Em teoria, os programas OCaml que não usam esses recursos podem ser compilados com o F #. Aprender OCaml é uma introdução perfeitamente razoável ao F # (e vice-versa, eu imagino).

A lista completa de diferenças está aqui (nota: substituição do arquivo morto do archive.org).

Chris Conway
fonte
3
Existe um equivalente camlp4 para F #?
Nlucaroni 07/10/08
Não pense assim. Mas você pode canalizar seu programa através do camlp4 e no compilador F #, provavelmente. (Não recomendo.)
Chris Conway
6
O F # possui argumentos nomeados e opcionais, mas usa uma sintaxe e semântica diferentes. Você terá problemas ao usar o Camlp4 com F # porque o F # quase sempre é sensível à indentação, portanto, será necessário um novo lexer e a documentação do Camlp4 sobre lexers permaneceu não escrita por quase dois anos.
JD
4
E agora o link está morto. Suponho que provavelmente seja bom. Tenho certeza que o F # foi aprimorado desde 08.
1
Ouvi em algum lugar que a Microsoft não queria adicionar funcionalidade do tipo camlp4 ao F # porque eles estavam preocupados com o fato de que essa funcionalidade poderia incentivar as pessoas a começar a usar ambientes de desenvolvimento diferentes do Microsoft Visual Studio.
chrismamo1
118

Esta pergunta já foi respondida há algum tempo, mas fiquei surpreso que a maioria das respostas diga quais recursos do OCaml estão faltando no F # - isso é definitivamente bom saber se você deseja portar os programas OCaml existentes para o F # (que provavelmente é o motivação da maioria dos artigos referenciados). No entanto, existem muitos recursos que tornam o F # um idioma diferente (não apenas uma versão limitada do OCaml for .NET!) Aqui estão algumas coisas adicionadas no F #:

  • Unidades de medida que permitem que você digite o código de verificação que trata dos cálculos numéricos
  • Metaprogramação usando cotações (que possibilita o uso do LINQ em F # e também é essencial para prometer projetos como a plataforma WebSharper)
  • Padrões ativos para criar abstrações para tipos de dados funcionais (e geralmente um recurso muito útil para aplicativos de correspondência de padrões mais complicados)
  • Expressões de computação que são um recurso de linguagem por trás de fluxos de trabalho assíncronos (uma biblioteca para programação de E / S / serviço da Web / GUI assíncrona)
  • Sistema de objetos compatível com .NET que possibilita a interoperação total com a plataforma .NET (o OCaml também oferece suporte a objetos, mas diferentes - é claro que existem alguns benefícios nos dois sistemas).
  • Operadores sobrecarregados - Até onde eu sei, o OCaml não possui operadores sobrecarregados - no F # você pode usar +para todos os tipos numéricos, bem como para os tipos que o suportam.

E, honestamente, acho que vale a pena mencionar o IDE do Visual Studio. Isso não faz parte do idioma, mas melhora realmente a experiência do usuário (o suporte do IntelliSense no Visual Studio é muito bom!)

Se você olhar para a lista, há muitas coisas que contribuíram amplamente para a popularidade do F #, então é muito mais do que apenas "OCaml sem functors". Definitivamente, o F # é baseado no OCaml (e pega idéias de outros idiomas, como Haskell) e compartilha muitos aspectos com eles, no entanto, também existem muitas outras coisas. Acho que sem coisas como fluxos de trabalho assíncronos, OO estilo .NET e metaprogramação, a Divisão de Desenvolvedores da Microsoft nunca incluiria F # no Visual Studio 2010.

Tomas Petricek
fonte
18
Woah! O OCaml foi criado especificamente para metaprogramação, sendo muito superior ao F # e .NET nesse contexto. O Camlp4 é um sistema de cotação muito mais poderoso que o do F #. Os lexers e analisadores do OCaml são muito melhores do que qualquer coisa disponível para o .NET. Além disso, estão disponíveis macros Camlp4 que implementam padrões ativos e expressões de computação. O OCaml também possui IDEs que oferecem os mesmos benefícios que o Visual Studio para F #.
JD
4
Porém, as cotações de F # têm um objetivo completamente diferente do que está disponível no Camlp4 (além disso, não é a linguagem OCaml - é um sistema em cima dela), portanto, não é justo compará-las. A existência de camlp4 é certamente uma vantagem de OCaml, mas não tem nada a ver com citações (que permitem coisas como WebSharper, correndo F # no GPU etc.)
Tomas Petricek
12
@ Tomas: Como você reconcilia sua alegação de que o Camlp4 "é um sistema no topo do" OCaml quando o Camlp4 é integrado ao OCaml no nível binário e as macros do Camlp4 podem ser definidas e usadas on-the-fly em um OCaml REPL em execução? Como você reconcilia sua alegação de que o Camlp4 "não tem nada a ver com cotações" com o fato de o Camlp4 fornecer um mecanismo de cotação? Como você reconcilia sua implicação de que o Camlp4 não pode facilitar os gostos do Websharper quando a ferramenta ocamljs da SkyDeck compila o código OCaml citado usando o Camlp4 para Javascript desde 2007?
JD
6
@ Tomas: O F # não pode nem citar expressões com variáveis ​​não acopladas <@ a @>, quanto mais definições de tipo, como <@ type t = int @>também não pode lidar com gramáticas arbitrárias, muito menos extensíveis como lexers e analisadores, como o Camlp4. A falta de um sistema macro decente é uma deficiência, mas, IMHO, a falta de lexers e analisadores decentes para o F # é um impedimento muito mais sério. Na verdade, eu aconselho os desenvolvedores a criar seus lexers e analisadores usando o OCaml, restringindo-se ao subconjunto que o F # suporta e portando-o de volta ao F # para se beneficiar do suporte superior à ferramenta do OCaml!
JD
8
@Erik: "A maioria das pessoas se concentra no que está faltando no F #, mas eu também queria ver o que estava faltando no OCaml". Observe que os padrões ativos, metaprogramação, expressões de computação e fluxos de trabalho assíncronos estavam disponíveis no OCaml antes de serem convertidos em F #.
JD
16

Eu sempre descrevo o F # como um primo do OCaml porque o OCaml possui muitos recursos que o F # não possui e que provavelmente nunca obterá. O F # está mais relacionado à linguagem CAML anterior. Em particular, o F # tem um suporte muito limitado para abstração e nenhum suporte para tipagem estrutural (como objetos do OCaml e variantes polimórficas ).

Ao contrário do que alguns respondentes escreveram, o F # tem suporte (limitado) para argumentos rotulados ("nomeados") e opcionais.

No entanto, todos esses são recursos avançados e você certamente pode começar a entender as idéias básicas por trás da programação funcional em pequena escala no estilo OCaml usando recursos sobre o OCaml. A primeira grande diferença que você descobrirá são problemas de larga escala, como encapsulamento e abstração, resolvidos de maneiras completamente diferentes no OCaml e no F #. Se você quiser aprender como fazer isso no F #, a única literatura disponível é este artigo sobre estruturas de dados puramente funcionais .

Também descobri que o maravilhoso sistema de módulos do OCaml facilita a parametrização do código sobre os tipos (como estruturas de dados), mas as alternativas OOP não são apenas hediondas, mas quase totalmente não utilizadas no .NET. Além disso, ao tentar escrever estruturas de dados com parâmetros elegantes, acertei dezenas de bugs no compilador F # porque ninguém sequer tentou fazer isso antes. O stdlib do F # contém algumas implementações legais da estrutura de dados, mas praticamente nenhuma reutilização, ou seja, é um trabalho fácil de colar.

JD
fonte
28
Todos os links exigem assinaturas pagas.
2
@Will eles parecem ser um plug descarado para coisas Jon Harrop escreveu-se (ele está listado como o autor de cada vez)
simbióticas
@ symbiont Sim, sabemos que é um pouco spam. Seria bom se você vinculasse a algumas informações adicionais gratuitas. Mas a resposta é boa sem os links, então aqui está você.
@Will seria bom se você vinculado algumas informações adicionais a si mesmo
simbionte
@ symbiont eu quis dizer Jon, não você, quando eu disse "você". Parece estranho ler isso. Não tenho certeza se Jon excluiu um comentário intersticial. De qualquer forma, aqui está: Meta Stack Exchange
9

F # e OCaml são classes taxonimicamente da família de idiomas ML, que também inclui uma série de outros animais estranhos. O F # é mais recente que o OCaml e ainda não possui functors [funções do módulo -> módulo] ou tipos de linha [classes de objetos e variantes polimórficas]. Entre eles, essas duas simplificações provavelmente facilitam a curva de aprendizado para quem está desenvolvendo na plataforma .Net. Infelizmente, esses dois recursos de linguagem são extremamente poderosos no OCaml, portanto, ler a literatura do OCaml para obter informações sobre como codificar para F # provavelmente levará a uma frustração prematura com o último, quando é provavelmente uma excelente alternativa ao C #, onde ambos estão disponíveis.

James Woodyatt
fonte
2

O F # suporta diretamente a sintaxe do OCaml. Pode não ser 100% compatível, mas acho que é bem próximo.

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

Aqui está uma lista de diferenças (não tenho certeza de quão atualizadas são)

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html

Lou Franco
fonte
1
"O F # suporta a sintaxe do OCaml diretamente. Pode não ser 100% compatível, mas acho que é bem próximo". IME, o suporte do compilador F # para compatibilidade com OCaml é muito problemático. Isso pode dificultar a portabilidade das bases de código OCaml existentes para o F # porque o compilador do F # morre internamente em código válido.
JD
Todos os links estão inoperantes.
Wingjam 2/02