F # cambia in OCaml [chiuso]


126

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 #.


3
Un altro confronto dal punto di vista di uno sviluppatore di OCaml, quindi è abbastanza parziale ma utile.
Mauricio Scheffer,

8
Attenzione: se sei interessato al destino di questa domanda, ti preghiamo di unirti alla discussione su Meta Stack Overflow o di discuterne in chat - i commenti qui sono stati straordinariamente improduttivi, quindi li ho rimossi.
Shog9,

1
@MauricioScheffer Link rotto!
JD,

2
@JonHarrop Penso che questo link potrebbe essere quello aggiornato. (Di Keiko Nakata)
Bart

Risposte:


89

Le differenze principali sono che F # non supporta:

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

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).


3
Esiste un equivalente camlp4 per F #?
nlucaroni,

Non la penso così. Ma potresti probabilmente reindirizzare il tuo programma attraverso camlp4 e nel compilatore F #, probabilmente. (Non lo consiglierei.)
Chris Conway,

6
F # ha argomenti nominati e opzionali ma usa una sintassi e una semantica diverse. Avrai problemi a usare Camlp4 con F # perché F # è quasi sempre sensibile al rientro, quindi avrà bisogno di un nuovo lexer e la documentazione di Camlp4 sui lexer è rimasta non scritta per quasi due anni.
JD,

4
E ora il link è morto. Suppongo che probabilmente sia buono. Sono sicuro che F # è stato migliorato dal '08.

1
Ho sentito da qualche parte che Microsoft non voleva aggiungere funzionalità di tipo camlp4 a F # perché temevano che tale funzionalità potesse incoraggiare le persone a iniziare a utilizzare ambienti di sviluppo diversi da Microsoft Visual Studio.
chrismamo1,

118

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 #:

  • Unità di misura che consentono di controllare il codice per i calcoli numerici
  • Meta-programmazione mediante citazioni (che consente di utilizzare LINQ in F # ed è anche essenziale per progetti promettenti 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 sono una caratteristica del linguaggio dietro flussi di lavoro asincroni (una libreria per I / O asincrono / servizio web / programmazione GUI)
  • Sistema di oggetti compatibile con .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 sovraccarichi - Per quanto ne so, OCaml non ha operatori sovraccarichi - in F # puoi usare +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.


18
Woah! OCaml è stato creato appositamente per la metaprogrammazione ed è di gran lunga superiore a F # e .NET in quel contesto. Camlp4 è un sistema di quotazione molto più potente di quello di F #. I lexer e i parser di OCaml sono molto meglio di qualsiasi cosa disponibile per .NET. Inoltre, sono disponibili macro Camlp4 che implementano modelli attivi ed espressioni di calcolo. OCaml ha anche IDE che offrono gli stessi vantaggi di Visual Studio per F #.
JD,

4
Le quotazioni di F # hanno un obiettivo completamente diverso rispetto a ciò che è disponibile in Camlp4 (a parte, questo non è il linguaggio OCaml - è un sistema sopra di esso), quindi non è giusto confrontarli. L'esistenza di Camlp4 è certamente un vantaggio di OCaml, ma non ha nulla a che fare con le citazioni (che consentono cose come WebSharper, l'esecuzione di F # su GPU ecc.)
Tomas Petricek,

12
@Tomas: Come conciliare l'affermazione secondo cui Camlp4 "è un sistema al di sopra di" OCaml quando Camlp4 è integrato con OCaml a livello binario e le macro Camlp4 possono essere definite e utilizzate al volo in un REPL OCaml in esecuzione? Come conciliare l'affermazione secondo cui Camlp4 "non ha nulla a che fare con le quotazioni" con il fatto che Camlp4 fornisce un meccanismo di quotazione? Come conciliare la tua implicazione sul fatto che Camlp4 non può facilitare artisti del calibro di Websharper quando lo strumento ocamljs di SkyDeck ha compilato il codice OCaml quotato usando Camlp4 in Javascript dal 2007?
JD

6
@Tomas: F # non può nemmeno citare espressioni con variabili non associate come <@ 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!
JD

8
@Erik: "La maggior parte delle persone si concentra su ciò che manca a F #, ma volevo anche vedere cosa mancava a OCaml". Si noti che i modelli attivi, la metaprogrammazione, le espressioni di calcolo e i flussi di lavoro asincroni erano disponibili in OCaml prima che diventassero F #.
JD,

16

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.


28
Tutti i collegamenti richiedono abbonamenti a pagamento.

2
@Saranno come una spina spudorata per le cose che Jon Harrop ha scritto da solo (è elencato come autore ogni volta)
simbionte il

@symbiont Sì, sappiamo che è un po 'spam. Sarebbe bello se ti collegassi ad alcune informazioni aggiuntive che erano gratuite. Ma la risposta va bene senza i collegamenti, quindi eccoti.

@ Sarebbe bello se tu stesso collegassi alcune informazioni aggiuntive
symbiont

@symbiont Intendevo jon, non tu, quando ho detto "tu". Sembra strano, leggendolo. Non sono sicuro che Jon abbia eliminato un commento interstiziale. Ad ogni modo, ecco qui: Scambio Meta Stack

9

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.


2

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


1
"F # supporta direttamente la sintassi OCaml. Potrebbe non essere compatibile al 100%, ma penso che sia abbastanza vicino". IME, il supporto del compilatore F # per la compatibilità OCaml è molto corretto. Ciò può rendere difficile il porting delle basi di codice OCaml esistenti su F # perché il compilatore F # muore internamente su codice valido.
JD

Tutti i collegamenti sono morti.
Wingjam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.