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 #.
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 #.
Respostas:
As principais diferenças são que o F # não suporta:
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).
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 #:
+
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.
<@ 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!
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.
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.
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