Apa bahasa produksi yang paling kompatibel dan banyak digunakan untuk mengekspor pengetahuan dan keterampilan yang diperoleh dari Haskell?

14

Saya suka Haskell, polos dan sederhana. Sementara Haskell digunakan dalam perangkat lunak produksi, itu tidak terlalu banyak digunakan dari apa yang saya lihat. Apa bahasa yang paling mirip dan masih banyak digunakan dalam hal proyek-proyek produksi sehingga saya dapat memiliki peluang bola salju untuk menggunakan sesuatu yang sama mengagumkannya di industri?

Juga apakah bahasa yang sama dari bagian pertama tersedia pada sejumlah besar platform? Jika tidak, apa alternatif terbaik yang memiliki penyebaran platform luas? Saya ingin satu bahasa untuk dimasukkan ke dalam daftar tugas daripada sekelompok besar atau keluarga. Bukti keras akan menjadi nilai tambah.

Insinyur Dunia
sumber

Jawaban:

21

Haskell paling dekat hubungannya dengan keluarga bahasa ML. Ini termasuk hal-hal seperti OCaml , tentu saja, tetapi juga F # pada platform .NET. Bahasa-bahasa ini berbagi dengan Haskell dasar sistem tipe dan bagaimana data digunakan - tipe data aljabar, pencocokan pola, inferensi tipe, dll. Mereka dapat berbeda secara substansial dari Haskell pada poin lain, tentu saja - kebanyakan ML ketat dan tidak murni , untuk mulai dengan, dan popularitas Haskell sebagai wahana untuk penelitian dalam sistem jenis dan desain bahasa berarti bahwa sebagian besar bahasa gaya-ML cenderung memiliki sistem jenis yang kurang kuat (tetapi berpotensi lebih mudah untuk dipahami). Mungkin aman untuk mengatakan itu sementara Anda mungkin kehilanganbeberapa hal tentang Haskell, terutama pada awalnya, sebagian besar programmer Haskell mungkin akan merasa nyaman di rumah dalam ML cukup cepat, pada tingkat dasar melakukan sesuatu. Jika Anda menginginkan bahasa dengan struktur keseluruhan yang sama dengan Haskell, ML adalah pilihan terbaik Anda.

Sisi fungsional Scalamenarik banyak dari tradisi ML, juga, dan juga menarik dalam beberapa fitur sistem tipe canggih yang akrab dari Haskell, serta sistem OOP yang lebih standar terintegrasi dengan di atas. Sementara OO dalam bahasa gaya-ML cenderung didekati sebagai lebih dari "model OO dengan alat fungsional dasar" Scala hidup dan bernafas OO gaya Jawa. Ini memiliki manfaat untuk Java interop, seperti yang Anda bayangkan, dan menghadirkan lingkungan kerja yang lebih akrab bagi programmer OO. Namun, berasal dari latar belakang Haskell, Anda lebih cenderung kesal dengan cara menggabungkan hal-hal bersama di Scala membuat idiom fungsional clumsier, dan menemukan sebagian besar API Java dirancang dengan buruk dan sulit digunakan.

Akhirnya, walaupun mungkin aneh untuk dipertimbangkan, Clojure sebenarnya memiliki banyak kesamaan dengan Haskell pada tingkat yang lebih filosofis. Sebagian besar dari apa yang akan Anda temukan dalam pendekatan Clojure untuk menyatakan dan nilai-nilai vs. identitas sangat dekat dengan apa yang diformalkan Haskell melalui sistem tipe. Sejalan dengan itu, Clojure menekankan Java interop ke tingkat yang lebih kecil dan tidak terlalu khawatir tentang menyeret dalam OOP, jadi dalam beberapa hal pendekatan Clojure untuk pemrograman fungsional itu sendiri mungkin paling dekat dengan apa yang sudah Anda kenal. Saya pikir itu menceritakan dalam hal ini bahwa, sejauh pengetahuan saya, Clojure adalah satu-satunya bahasa selain Haskell yang memiliki implementasi STMitu sederhana, efektif, dan hanya berfungsi. Di sisi lain, Clojure berasal dari tradisi Lisp dan dengan demikian tidak memiliki sistem tipe statis dan penekanan pada tipe data aljabar dan pencocokan pola yang ditemukan dalam bahasa yang dipengaruhi ML. Dan tentu saja itu adalah Lisp, yang itu sendiri negatif untuk beberapa orang (meskipun saya benar-benar tidak tahu mengapa).

Berbicara sendiri, dengan penafian bahwa pengalaman pertama saya dengan pemrograman fungsional ada di Skema, saya mungkin akan condong ke Clojure, dengan OCaml kemungkinan pilihan kedua.

CA McCann
sumber
F # dikatakan telah terinspirasi oleh, jika bukan berasal dari, OCaml. Pertanyaan SO sebelumnya, F # dan OCaml , membahas diskusi yang baik tentang hubungan itu. Jika Anda berada di sisi .NET, F # akan menjadi pilihan yang sangat baik dan Microsoft sekarang menganggap F # sebagai "kelas pertama" .NET bahasa. Di sisi JVM, Scala memiliki rekam jejak penggunaan industri dan Clojure tampaknya naik di tangga lagu. Saya tidak tahu satu pun pilihan terbaik, saat ini, karena pasar belum menyatakan pemenang yang jelas dalam ruang fungsional-objek ini.
John Tobler
4

Saya tidak pernah menggunakannya sendiri, tapi saya melihat Scala muncul di blog atau deskripsi proyek kadang-kadang dan saya percaya itu mengambil konsep utama dari Haskell. Scala mengkompilasi ke JVM dan dapat beroperasi dengan Java.

Jürgen Strobel
sumber
3

Alternatif fungsional adalah Erlang . Sementara itu adalah bahasa yang sangat konkuren, subset berurutan adalah bahasa fungsional murni dengan banyak sifat bahasa fungsional, misalnya penutupan, data tidak berubah dan pencocokan pola. Ini berjalan pada banyak platform termasuk linux, berbagai unix, windows dan macosx. Sekarang bahkan ada implementasi pada JVM, erjang . Itu dapat dengan mudah berkomunikasi dan hidup berdampingan dengan bahasa lain, ini adalah bagaimana itu sering digunakan.

Lihatlah situs utama .

rvirding
sumber
3

Clojure semakin banyak digunakan, dan walaupun tidak terlihat seperti Haskell pada tingkat yang dangkal, jika Anda melihat sedikit lebih dalam, itu jelas sangat terinspirasi oleh Haskell dan mendorong gaya fungsional yang sangat mirip.

Fitur-fitur Clojure utama yang pengguna Haskell mungkin kenal dan menarik:

  • Bahasa inti adalah murni fungsional - sementara efek samping dimungkinkan, mereka dimakamkan di tempat-tempat tertentu (misalnya referensi STM, fungsi IO, interoperabilitas Java)
  • Semua struktur data tidak berubah dan persisten
  • Kemalasan - dicapai sebagian besar melalui urutan malas Clojure di mana-mana, ini akan terasa sangat akrab bagi pengguna Haskell. Urutan malas tak terbatas baik-baik saja.
  • Memori Transaksional Perangkat Lunak - adalah cara utama menangani keadaan yang bisa berubah di Clojure. Layak menonton video luar biasa ini di mana Rich Hickey menjelaskan pendekatan Clojure terhadap identitas dan status: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Perbedaan utama (mungkin positif atau negatif tergantung Anda perspektif Anda):

  • Itu tidak murni - meskipun pengamatan saya adalah bahwa gaya Clojure idiomatik adalah untuk menempel fungsi murni sedapat mungkin.
  • Pengetikan dinamis daripada statis (meskipun petunjuk tipe statis dapat digunakan secara opsional untuk optimasi kinerja)
  • Ini adalah bahasa JVM dengan akses mudah ke seluruh ekosistem perpustakaan Java - ini menurut saya keuntungan terbesar dalam hal penerapan dunia nyata
  • Sintaks lis. Jadi Anda mendapatkan semua manfaat dari homoiconicity , dengan biaya harus belajar melihat semua tanda kurung :-)

Perspektif pribadi: Saya belajar Haskell sebelum Clojure, dan menyukai Haskell karena keanggunan dan kemurnian matematisnya. Clojure mendapat banyak inspirasi dan meminjam banyak fitur bagus dari Haskell, tetapi merupakan bahasa yang jauh lebih pragmatis / praktis. Terutama ketika Anda menghitung nilai besar untuk dapat memanfaatkan ekosistem perpustakaan Java maka itu adalah bahasa yang bagus untuk "menyelesaikan sesuatu".

mikera
sumber
1

Jika Anda menyukai Haskell, tetapi harus membuat kode untuk JVM, frege mungkin menarik bagi Anda. Ini dirancang sedekat mungkin dengan Haskell 2010, namun menghasilkan kode Java.

Tentu saja, frege itu sendiri tidak seperti "bahasa produksi yang banyak digunakan" (itu baru saja diterbitkan), tetapi Java tentu saja.

Ingo
sumber