2010-11-21 16 views
16

Buona giornata tutto,compatibilità di codice tra OCaml e F #

Sto sviluppando un piccolo progetto di hobby in OCaml. Mi stavo chiedendo quanto sarebbe facile migrarlo su F #. So che F # ha alcune funzionalità che OCaml non ha, ma speravo che il mio codice OCaml avrebbe richiesto un piccolo sforzo per portarlo. Non voglio necessariamente migrare, voglio mantenere/sviluppare su entrambe le piattaforme.

Grazie in anticipo, Michael

+2

Si dovrebbe vedere http://stackoverflow.com/questions/179492/f-and-ocaml –

risposta

0

non ho fatto alcun OCaml a F # -porting, ma so F # è stato progettato con la compatibilità OCaml in mente. Come so, F # è principalmente un superset di base di OCaml.

Dovrebbe supportare (e senza #light essere limitato a) la maggior parte delle parole chiave OCaml e avere equivalenti della maggior parte delle funzioni standard nelle librerie principali (o nel framework .Net). Quindi immagino che - almeno per i progetti di hobby - il porting dovrebbe essere davvero facile.

F # non ha il sistema di modulo avanzato di OCaml, quindi avrai problemi con l'implementazione, ad es. funtori.

+0

Questo era vero diversi anni fa, ma non credo che sia più preciso. Un sacco di cose di base in F # è da tempo divergente da OCaml. Ad esempio, l'indicizzazione di un array è 'a. (I)' in OCaml ma 'a. [I]' con un'annotazione di tipo in F #. Gli operatori aritmetici di base di OCaml su numeri in virgola mobile ('+ .',' * .' ecc.) Non funzionano più correttamente in F #. –

+1

F # non è principalmente un superset di OCaml, ma un sottoinsieme con alcune estensioni (pattern attivi, ecc.). La risposta di Jon elenca alcune delle funzionalità di OCaml che non sono supportate da F #. –

13

Scrivere codice di cross-compilazione mi sembra un mondo di dolore. John Whitington of Coherent PDF è l'unica persona che conosco che abbia provato a farlo in qualsiasi misura reale.

Ho tradotto molto codice OCaml in F # (probabilmente più di chiunque altro al mondo) e i problemi principali sono la sintassi #light, l'uso di qualsiasi caratteristica OCaml non banale (oggetti, varianti polimorfiche, ordine superiore moduli, argomenti etichettati e opzionali e così via), librerie (ad es. lablgl, lablgtk, ocamlgraph, pigrizia), macro (analisi, flussi, estensioni di pattern matching) e modifiche nella sintassi di base come l'indicizzazione di array. Ad esempio, ho appena provato a portare lo Almabench benchmark da OCaml a F # e ci sono volute diverse ore perché ho finito per dover riscrivere ogni a.[i] a a.(i) a causa di una moltitudine di bug nel compilatore F #: la sua modalità di compatibilità OCaml è abbastanza fragile.

Quindi ti consiglio di scegliere tra le lingue piuttosto che provare a eseguire la compilazione incrociata.

+0

Grazie mille. Quello che volevo evitare era imparare una lingua in più. Dal momento che ho una conoscenza pratica di .NET (C#) e conoscenza di base di OCaml (dal mio corso di programmazione funzionale), ho pensato che F # fosse (quasi) un dato. Apparentemente non lo è. :) – user515232

+1

Nessun problema. Probabilmente troverai più di un aiuto che un ostacolo per imparare sia OCaml che F # allo stesso tempo perché sono così simili ma probabilmente troverai anche le differenze molto illuminanti. –

Problemi correlati