Domanda

F # deriva da OCaml, ma quali elementi principali mancano o vengono aggiunti? In particolare, sono curioso di sapere se le risorse disponibili per l'apprendimento di OCaml sono utili anche a qualcuno che vuole imparare F #.

È stato utile?

Soluzione

Le differenze principali sono che F # non supporta:

  • funtori
  • oggetti in stile OCaml
  • varianti polimorfiche
  • il preprocessore camlp4 / 5 o i punti di estensione (ppx)

Inoltre, F # ha una sintassi diversa per i parametri etichettati e facoltativi.

In teoria, i programmi OCaml che non usano queste funzionalità possono essere compilati con F #. Imparare OCaml è un'introduzione perfettamente ragionevole a F # (e viceversa, immagino).

L'elenco completo delle differenze è qui (nota: sostituzione archive.org del collegamento morto).

Altri suggerimenti

Questa domanda ha una risposta da qualche tempo, ma sono rimasto piuttosto sorpreso dal fatto che la maggior parte delle risposte dica quali funzioni di OCaml mancano in F # - questo è sicuramente utile per sapere se si desidera trasferire i programmi OCaml esistenti su F # (che è probabilmente la motivazione della maggior parte degli articoli citati). Tuttavia, ci sono molte funzionalità che rendono F # un linguaggio diverso (non solo una versione limitata di OCaml per .NET!) Ecco un paio di cose che vengono aggiunte in F #:

  • Unità di misura che ti consentono di controllare il codice relativo ai calcoli numerici
  • Meta-programmazione utilizzando le virgolette (che consente di utilizzare LINQ in F # ed è anche essenziale per promettere progetti come la piattaforma WebSharper)
  • Pattern attivi per la creazione di astrazioni per tipi di dati funzionali (e funzionalità generalmente molto utile per applicazioni di abbinamento dei pattern più complicate)
  • Espressioni di calcolo che è una caratteristica del linguaggio dietro flussi di lavoro asincroni (una libreria per la programmazione di I / O / servizi web / GUI asincroni)
  • Sistema di oggetti compatibile .NET che consente di interagire completamente con la piattaforma .NET (OCaml ha anche un supporto per oggetti ma diversi - ci sono ovviamente alcuni vantaggi in entrambi i sistemi ).
  • Operatori sovraccaricati - Per quanto ne so, OCaml non ha operatori sovraccarichi - in F # puoi usare + per tutti i tipi numerici e per i tuoi tipi che supportalo.

E, onestamente, penso che valga la pena menzionare anche l'IDE di Visual Studio. Questo non fa parte del linguaggio, ma migliora davvero l'esperienza dell'utente (il supporto IntelliSense in Visual Studio è davvero buono!)

Se guardi l'elenco, ci sono molte cose che hanno ampiamente contribuito alla popolarità di F #, quindi è molto più di un semplice "OCaml senza funzione". F # è sicuramente basato su OCaml (e prende idee da altre lingue come Haskell) e condivide molti aspetti con loro, tuttavia ci sono anche molte altre cose. Immagino che senza cose come flussi di lavoro asincroni, OO in stile .NET e meta-programmazione, la Divisione sviluppatori Microsoft non includerebbe mai F # in Visual Studio 2010.

Descrivo sempre F # come cugino di OCaml perché OCaml ha molte caratteristiche che F # non ha e che non è probabile che ottengano. F # è più strettamente correlato al linguaggio CAML precedente. In particolare, F # ha un supporto molto limitato per l'astrazione e nessun supporto per la tipizzazione strutturale (come oggetti e varianti polimorfiche ) affatto.

Contrariamente a quanto hanno scritto alcuni intervistati, F # ha un supporto (limitato) per argomenti etichettati ("quotati") e facoltativi.

Tuttavia, queste sono tutte funzionalità avanzate e puoi certamente iniziare a familiarizzare con le idee di base dietro la programmazione funzionale in stile OCaml su piccola scala usando risorse su OCaml. La prima grande differenza che scoprirai è problemi su larga scala come l'incapsulamento e l'astrazione che sono risolti in modi completamente diversi in OCaml e in F #. Se vuoi imparare come farlo in F #, l'unica letteratura disponibile è questo articolo su strutture di dati puramente funzionali .

Ho anche scoperto che il meraviglioso sistema di moduli di OCaml semplifica la parametrizzazione del codice su tipi (come le strutture di dati) ma le alternative OOP non sono solo orribili ma quasi del tutto inutilizzate su .NET. Inoltre, quando provo a scrivere strutture di dati elegantemente parametrizzate, colgo dozzine di bug nel compilatore F # perché nessuno ha mai provato a farlo prima. F # stdlib contiene alcune belle implementazioni della struttura dei dati ma praticamente nessun riutilizzo, vale a dire è un lavoro di taglia e incolla.

F # e OCaml sono classi tassonimiche della famiglia di lingue ML, che include anche un intero passaporto di altri strani animali. F # è più recente di OCaml e non ha neanche due funzioni [funzioni del modulo - > modulo] o tipi di riga [classi di oggetti e varianti polimorfiche] ancora. Tra di loro, queste due semplificazioni probabilmente semplificano la curva di apprendimento per qualcuno che si sviluppa sulla piattaforma .Net. Purtroppo, queste due funzioni linguistiche sono estremamente potenti in OCaml, quindi leggere la letteratura OCaml per ottenere informazioni su come codificare F # probabilmente porterà a una frustrazione prematura con quest'ultima quando è probabilmente un'ottima alternativa a C # dove entrambe sono disponibili.

F # supporta direttamente la sintassi OCaml. Potrebbe non essere compatibile al 100%, ma penso che sia abbastanza vicino.

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

Ecco un elenco di differenze (non sono sicuro di quanto sia aggiornato)

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top