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 #.
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 #.
Risposte:
Le differenze principali sono che F # non supporta:
Inoltre, F # ha una sintassi diversa per i parametri etichettati e facoltativi.
In teoria, i programmi OCaml che non utilizzano 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 di.org.org del collegamento morto).
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 il 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 #:
+
per tutti i tipi numerici così come i tuoi tipi che lo supportano.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.
<@ a @>
, per non parlare di definizioni di tipo come <@ type t = int @>
e non può gestire grammatiche arbitrarie molto meno estensibili lexer e parser come fa Camlp4. La mancanza di un sistema macro decente è una carenza ma, IMHO, la mancanza di qualsiasi lexer e parser decenti per F # è un ostacolo molto più grave. In realtà, consiglio agli sviluppatori di creare i loro lexer e parser usando OCaml, limitandosi al sottoinsieme che F # supporta e riportandolo su F # per beneficiare del supporto di strumenti superiore di OCaml!
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 gli oggetti di OCaml e le varianti polimorfiche ).
Contrariamente a quanto hanno scritto alcuni rispondenti, F # ha (limitato) il supporto per argomenti etichettati ("nominati") e opzionali.
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 utilizzando 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 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 da tagliare.
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 ancora né funzioni [funzioni del modulo -> modulo] né tipi di riga [classi di oggetti e varianti polimorfiche]. 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