F # berubah menjadi OCaml [ditutup]

126

F # berasal dari OCaml, tetapi item utama apa yang hilang atau ditambahkan? Khususnya saya ingin tahu apakah sumber daya yang tersedia untuk belajar OCaml juga berguna bagi seseorang yang ingin belajar F #.

Erik Forbes
sumber
3
Perbandingan lain dari perspektif pengembang OCaml sehingga cukup bias tetapi tetap bermanfaat.
Mauricio Scheffer
8
Perhatian: jika Anda tertarik dengan nasib pertanyaan ini, silakan bergabung dengan diskusi tentang Meta Stack Overflow atau diskusikan dalam obrolan - komentar di sini sangat tidak produktif, jadi saya telah menghapusnya.
Shog9
1
@MauricioScheffer Tautan Rusak!
JD
2
@ JonHarrop Saya pikir tautan ini mungkin yang diperbarui. (Oleh Keiko Nakata)
Bart

Jawaban:

89

Perbedaan utama adalah bahwa F # tidak mendukung:

  • functors
  • Objek gaya OCaml
  • varian polimorfik
  • preprocessor atau poin ekstensi camlp4 / 5 (ppx)

Selain itu, F # memiliki sintaks yang berbeda untuk parameter berlabel dan opsional.

Secara teori, program OCaml yang tidak menggunakan fitur-fitur ini dapat dikompilasi dengan F #. Mempelajari OCaml adalah pengantar yang masuk akal untuk F # (dan sebaliknya, saya bayangkan).

Daftar lengkap perbedaan ada di sini (catatan: archive.org penggantian tautan mati).

Chris Conway
sumber
3
Apakah ada yang setara dengan camlp4 untuk F #?
nlucaroni
Jangan berpikir begitu. Tapi Anda bisa menyalurkan program Anda melalui camlp4 dan ke kompiler F #, mungkin. (Tidak akan merekomendasikannya.)
Chris Conway
6
F # memang memiliki nama dan argumen opsional tetapi menggunakan sintaks dan semantik yang berbeda. Anda akan mengalami kesulitan menggunakan Camlp4 dengan F # karena F # hampir selalu sensitif terhadap lekukan sehingga akan membutuhkan lexer baru dan dokumentasi Camlp4 pada lexers tetap tidak tertulis selama hampir dua tahun.
JD
4
Dan sekarang tautannya sudah mati. Saya kira itu mungkin bagus. Saya yakin F # telah ditingkatkan sejak '08.
1
Saya mendengar di suatu tempat bahwa Microsoft tidak ingin menambahkan fungsionalitas seperti camlp4 ke F # karena mereka khawatir bahwa fungsi tersebut dapat mendorong orang untuk mulai menggunakan lingkungan pengembangan selain Microsoft Visual Studio.
chrismamo1
118

Pertanyaan ini telah dijawab untuk beberapa waktu sekarang, tetapi saya cukup terkejut bahwa sebagian besar jawaban mengatakan apa fitur OCaml yang hilang dalam F # - ini pasti baik untuk mengetahui apakah Anda ingin port program OCaml yang ada ke F # (yang mungkin merupakan motivasi sebagian besar artikel yang dirujuk). Namun, ada banyak fitur yang menjadikan F # bahasa yang berbeda (bukan hanya versi terbatas OCaml untuk .NET!) Berikut adalah beberapa hal yang ditambahkan dalam F #:

  • Satuan ukuran yang memungkinkan Anda mengetik-periksa kode yang berhubungan dengan perhitungan numerik
  • Meta-pemrograman menggunakan kutipan (yang memungkinkan untuk menggunakan LINQ di F # dan juga penting untuk proyek-proyek yang menjanjikan seperti platform WebSharper)
  • Pola aktif untuk membuat abstraksi untuk tipe data fungsional (dan umumnya fitur yang sangat berguna untuk aplikasi pencocokan pola yang lebih rumit)
  • Ekspresi komputasi yang merupakan fitur bahasa di balik alur kerja asinkron (pustaka untuk I / O / layanan web / pemrograman GUI asinkron)
  • Objek-sistem .NET kompatibel yang memungkinkan untuk sepenuhnya beroperasi dengan platform .NET (OCaml juga memiliki dukungan untuk objek tetapi berbeda - tentu saja ada beberapa manfaat di kedua sistem).
  • Operator kelebihan beban - Sejauh yang saya tahu, OCaml tidak memiliki operator kelebihan beban - di F # Anda dapat menggunakan +untuk semua tipe numerik serta tipe Anda yang mendukungnya.

Dan, jujur, saya pikir itu juga layak disebut Visual Studio IDE. Ini bukan bagian dari bahasa, tetapi benar-benar meningkatkan pengalaman pengguna (dukungan IntelliSense di Visual Studio sangat bagus!)

Jika Anda melihat daftar, ada banyak hal yang sebagian besar berkontribusi pada popularitas F #, jadi itu lebih dari sekadar "OCaml tanpa functors". F # jelas didasarkan pada OCaml (dan mengambil ide dari bahasa lain seperti Haskell) dan berbagi banyak aspek dengan mereka, namun ada juga banyak hal lain. Saya kira tanpa hal-hal seperti alur kerja asinkron, .NET style OO dan meta-programming, Divisi Pengembang Microsoft tidak akan pernah memasukkan F # dalam Visual Studio 2010.

Tomas Petricek
sumber
18
Wow! OCaml secara khusus dibiakkan untuk metaprogramming itu jauh lebih unggul daripada F # dan .NET dalam konteks itu. Camlp4 adalah sistem kutipan yang jauh lebih kuat daripada F #. Lexer dan parser OCaml jauh lebih baik daripada apa pun yang tersedia untuk .NET. Juga, makro Camlp4 tersedia yang menerapkan pola aktif dan ekspresi komputasi. OCaml juga memiliki IDE yang memberikan manfaat yang sama dengan Visual Studio untuk F #.
JD
4
Kutipan F # memiliki tujuan yang sama sekali berbeda dari yang tersedia di Camlp4 (selain itu, ini bukan bahasa OCaml - ini adalah sistem di atasnya), jadi tidak adil untuk membandingkannya. Keberadaan Camlp4 tentu saja merupakan keunggulan OCaml, tetapi itu tidak ada hubungannya dengan kutipan (yang memungkinkan hal-hal seperti WebSharper, menjalankan F # pada GPU dll.)
Tomas Petricek
12
@ Thomas: Bagaimana Anda mendamaikan klaim Anda bahwa Camlp4 "adalah sistem di atas" OCaml ketika Camlp4 diintegrasikan dengan OCaml di tingkat biner dan makro Camlp4 dapat ditentukan dan digunakan dengan cepat saat menjalankan REPL OCAML yang berjalan? Bagaimana Anda mendamaikan klaim Anda bahwa Camlp4 "tidak ada hubungannya dengan kutipan" dengan fakta bahwa Camlp4 menyediakan mekanisme kutipan? Bagaimana Anda mendamaikan implikasi Anda bahwa Camlp4 tidak dapat memfasilitasi orang-orang seperti Websharper ketika alat ocamljs SkyDeck telah mengkompilasi kode OCaml yang dikutip menggunakan Camlp4 ke Javascript sejak 2007?
JD
6
@ Thomas: F # bahkan tidak bisa mengutip ekspresi dengan variabel tidak terikat seperti <@ a @>, apalagi ketik definisi suka <@ type t = int @>dan tidak bisa menangani tata bahasa yang sewenang-wenang apalagi extenderble lexers dan parser seperti yang dilakukan Camlp4. Kurangnya sistem makro yang layak adalah satu kekurangan tetapi, IMHO, kurangnya lexers dan parser yang layak untuk F # adalah hambatan yang jauh lebih serius. Saya sebenarnya menyarankan pengembang untuk membuat lexer dan parser mereka menggunakan OCaml, membatasi diri mereka pada subset yang mendukung F # dan memindahkannya kembali ke F # untuk mendapatkan manfaat dari dukungan alat unggulan OCaml!
JD
8
@Erik: "Kebanyakan orang fokus pada apa yang hilang dari F #, tetapi saya juga ingin melihat apa yang hilang dari OCaml". Perhatikan bahwa pola aktif, pemrograman, ekspresi komputasi, dan alur kerja asinkron tersedia di OCaml sebelum membuatnya menjadi F #.
JD
16

Saya selalu menggambarkan F # sebagai sepupu dari OCaml karena OCaml memiliki banyak fitur yang F # tidak miliki dan tidak pernah mungkin didapat. F # lebih dekat hubungannya dengan bahasa CAML sebelumnya. Secara khusus, F # memiliki dukungan yang sangat terbatas untuk abstraksi dan tidak ada dukungan untuk mengetik struktural (seperti OCaml ini benda-benda dan varian polimorfik ) sama sekali.

Berlawanan dengan apa yang ditulis beberapa responden, F # memang memiliki (terbatas) dukungan untuk berlabel ("bernama") dan argumen opsional.

Namun, ini semua adalah fitur-fitur canggih dan Anda tentu dapat mulai memahami ide-ide dasar di balik pemrograman fungsional gaya-kecil OCaml menggunakan sumber daya tentang OCaml. Perbedaan utama pertama yang akan Anda temukan adalah masalah skala besar seperti enkapsulasi dan abstraksi yang diselesaikan dengan cara yang sangat berbeda di OCaml dan di F #. Jika Anda ingin mempelajari cara melakukannya di F #, satu-satunya literatur yang tersedia adalah artikel ini tentang struktur data yang murni fungsional .

Saya juga telah menemukan bahwa sistem modul OCaml yang luar biasa memudahkan parameter parameter kode lebih dari jenis (seperti struktur data) tetapi alternatif OOP tidak hanya mengerikan tetapi hampir seluruhnya tidak digunakan di .NET. Selain itu, ketika mencoba untuk menulis struktur data parameter-elegan, saya memukul lusinan bug di kompiler F # karena tidak ada yang bahkan pernah mencoba melakukan ini sebelumnya. F # stdlib memang mengandung beberapa implementasi struktur data yang bagus tetapi sebenarnya tidak dapat digunakan kembali, yaitu itu adalah pekerjaan cut'n'paste.

JD
sumber
28
Semua tautan membutuhkan langganan berbayar.
2
@Apakah mereka tampaknya menjadi plug tak tahu malu untuk hal-hal yang ditulis Jon Harrop sendiri (dia terdaftar sebagai penulis setiap kali)
symbiont
@symbiont Ya, kami tahu ini sedikit spam. Akan lebih baik jika Anda menautkan ke beberapa informasi tambahan yang gratis. Tapi jawabannya baik-baik saja tanpa tautan, jadi itu dia.
@Apakah akan lebih baik jika Anda menautkan beberapa informasi tambahan sendiri
symbiont
@symbiont maksudku jon, bukan kamu, ketika aku berkata "kamu". Kedengarannya aneh, membacanya. Tidak yakin apakah Jon menghapus komentar pengantara. Bagaimanapun, ini dia: Meta Stack Exchange
9

F # dan OCaml adalah kelas taksonomi dalam keluarga bahasa ML, yang mencakup seluruh kumpulan hewan aneh lainnya juga. F # lebih baru dari OCaml, dan ia tidak memiliki functors [fungsi modul -> modul] atau tipe baris [kelas objek dan varian polimorfik]. Di antara mereka, kedua penyederhanaan itu mungkin membuat kurva belajar lebih mudah bagi seseorang yang mengembangkan platform .Net. Sayangnya, kedua fitur bahasa tersebut sangat kuat di OCaml, jadi membaca literatur OCaml untuk mendapatkan wawasan tentang cara membuat kode untuk F # mungkin akan menyebabkan frustrasi dini dengan yang kedua ketika itu mungkin merupakan alternatif yang sangat baik untuk C # di mana keduanya tersedia.

james woodyatt
sumber
2

F # mendukung sintaks OCaml secara langsung. Mungkin tidak 100% kompatibel, tapi saya pikir itu cukup dekat.

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

Berikut adalah daftar perbedaan (tidak yakin seberapa mutakhirnya)

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

Lou Franco
sumber
1
"F # mendukung sintaks OCaml secara langsung. Mungkin tidak 100% kompatibel, tapi saya pikir itu cukup dekat". Dukungan IME the F # compiler untuk kompatibilitas OCaml sangat buggy. Ini dapat mempersulit untuk mem-port basis kode OCaml yang ada ke F # karena kompiler F # mati secara internal pada kode yang valid.
JD
Semua tautan mati.
Wingjam