Haskell dikatakan sebagai bahasa bagi para genius dan akademisi. Benar?



Saya pernah berbicara dengan pendiri startup Israel yang sedang mengembangkan basis data GPU berkecepatan tinggi. Haskell dan C ++ ada di tumpukan mereka, dan pendiri mengeluh tentang betapa sulitnya menemukan orang di tim. Dia terbang ke Moskow, termasuk mencari programmer yang bagus.

Dengan hati-hati saya bertanya apakah lebih baik menggunakan sesuatu yang lebih umum dan baru. Dan meskipun jawabannya sopan dan konstruktif, di antara kalimat-kalimat itu bagiku: "Pff, bahkan tidak menyebutkan mainan yape ini."

Semua yang saya dengar tentang Haskell dari samping sejak saat itu datang ke satu hal - "lelucon buruk dengannya." Untuk mengenal lebih baik para Haskellis, saya datang ke obrolan telegram untuk bertanya kepada mereka. Itu sangat menakutkan, dan ternyata, tidak sia-sia.

Mereka tidak ingin berbicara tentang Haskell secara populer, dan tampaknya mereka merenungkan usaha semacam itu dengan jijik. Sudah berbicara - dengan kelengkapan dan objektivitas maksimum. “Salah satu kualitas karakteristik Haskell sebagai bahasa dan komunitas adalah bahwa bersama-sama mereka tidak berusaha untuk menjadi populer, memberikan jawaban sederhana untuk pertanyaan populer. Sebaliknya, mereka membangun cara berprinsip yang logis untuk menyelesaikan masalah nyata, daripada dengan cepat menembus ke dalam hati orang yang lewat, oleh orang yang tertarik, ”tulis mereka kepada saya di sana.

Namun, beberapa orang berbagi pengalaman mereka, dan saya mengumpulkan pendapat mereka di sini.

Denis Mirzoev ( nolane ) : Di universitas, dengan subjek "Bahasa Pemrograman" saya ditawari untuk mengambil kursus di Haskell Coursera dengan satu poin tambahan dari seratus. Lalu ada kursus pemrograman fungsional di mana Haskell berlangsung. Dia menulis makalah panjang dan pekerjaan sarjana dari GHC. Menemukan pekerjaan sebagai programmer Haskell.

Itu sulit, dan masih sulit. Ketika Anda mulai mempelajari Haskell, Anda harus memahami banyak konsep baru. Ini kerja keras. Anda benar-benar belajar memprogram lagi.

Akan sulit bagi banyak orang sekarang untuk mengingat bagaimana mereka memulai perjalanan mereka dalam pemrograman, betapa sulitnya untuk memahami apa "pointer" itu, apa "fungsi" itu, apa "kelas" itu. Mungkin itu sebabnya mempelajari Haskell sangat sulit. Seiring bertambahnya usia, semakin sulit untuk mempelajari hal-hal baru.

Doctor_Ryner : Suatu kali pada masa percobaan, saya jatuh ke Redux, jadi melihat pelajaran dari penciptanya, saya memutuskan untuk mengenal semua orang dengan lebih baik. Pada awalnya saya menerapkan praktik yang dipelajari dalam JavaScript, tetapi kemudian saya belajar tentang Haskell, yang dianggap sebagai bahasa fungsional yang sebenarnya. Saya langsung tertarik dengan keanggunannya dan banyak konsep baru yang tidak saya ketahui.

Itu tidak mudah dengan tutorial tanpa akhir tentang monad pada contoh burrito, yang sangat membingungkan. Juga, latar belakang imperatif membuat sulit untuk membuka konsep baru.

Yuri Syrovetsky ( cblp ) : Hal yang paling sulit untuk dipelajari adalah Haskell kedua, ketika duckling syndrome tidak lolos ke bahasa pertama.

Apa yang baik dan apa bahasa yang buruk?


Doctor_Ryner : Bahasanya sangat ringkas, elegan, dan fleksibel, tidak berarti setengah perpustakaan di dalamnya adalah EDSL (setidaknya kesan itu).

Yuri Syrovetsky ( cblp ) : Ekspresivitas tinggi, mudah mentransfer area subjek ke kode, kombinasi optimal dari paradigma imperatif dan fungsional. Sangat mudah untuk membangun abstraksi pada data dan algoritma, yang memungkinkan Anda untuk memikirkan masalah tanpa terganggu oleh hal-hal kecil yang tidak terkait.

John Doe : Ketikan yang kuat (saya akan katakan fasis).

Igor Shevnin ( interphx ) : Sistem tipe yang sangat ekspresif. Tidak sekuat Idris atau Agda, tetapi mencapai jalan tengah itu ketika hampir semuanya bisa diekspresikan, dan tipe inferensi berfungsi dengan baik. Anda tidak perlu memberi tag secara manual di mana pun.

Tetapi sistem tipe yang kuat membuat Anda memperhatikan nilai yang diteruskan. Sekelompok definisi tipe mungkin terlihat seperti boilerplate. Setiap tim menggunakan set ekstensi sendiri atau tidak menggunakannya sama sekali. Kode ini lebih "padat" - satu baris sering membawa lebih banyak informasi daripada dalam bahasa lain, sehingga lebih sulit bagi pengembang yang tidak berpengalaman untuk membacanya.

Doctor_Ryner : Ketika Anda mempelajari Haskell, Anda kemungkinan besar akan menemukan pepatah "jika itu dikompilasi, itu mungkin benar." Tidak ada null, paradigma fungsional itu sendiri sangat ketat dan memaksa Anda untuk mengikuti aturan tertentu, yang dalam kebanyakan kasus mengarah ke desain yang lebih baik.

Misalnya, tidak ada variabel dalam bahasa - hanya konstanta. Anda tidak harus melacak apa dan di mana Anda menetapkan. Haskell mendorong penggunaan fungsi murni, yang tidak menghasilkan efek samping. Desain fungsional hanya membuat program bekerja secara keseluruhan, berlawanan dengan OOP, di mana banyak objek dilemparkan ke dunia dan objek mencoba berkomunikasi satu sama lain melalui efek samping, mengubah aplikasi menjadi kekacauan yang tidak dapat diprediksi. Di tempat kerja, kita cukup menderita dari ini dengan C # di Unity.

Denis Mirzoev : Kemalasan bawaan meningkatkan ekspresi bahasa. Banyak algoritma menjadi lebih mudah. Ini dapat meningkatkan produktivitas jika hasil perhitungan antara tidak digunakan. (Misalnya, `head. Sort` berfungsi dalam waktu linier).

Igor Shevnin : Model komputasi malas biasanya membantu, tetapi ketika urutan fungsi panggilan penting, mungkin sulit untuk mengetahui apa yang terjadi.

Doctor_Ryner : Dikompilasi, yang segera memberi peningkatan besar dalam kecepatan.

Denis Mirzoev : Dibandingkan dengan Jawa dalam kecepatan, tetapi tidak secepat C.

Igor Shevnin : Di luar kotak, ada dukungan untuk ekstensi yang memungkinkan Anda menyelesaikan bahasa dan mengetik sistem. Namun, ada banyak ekstensi yang digunakan secara luas yang akrab bagi komunitas, memiliki contoh dan dokumentasi yang layak, dan bukan ceruk.

Doctor_Ryner : Pustaka standar Prelude memiliki fungsi yang sangat buruk seperti membaca, kepala, readFile, yang dapat membuang Pengecualian dan dimasukkan ke dalam program, bukannya mengembalikan Mungkin. Karena itu, Anda harus menggunakan alternatif atau menulis implementasi Anda sendiri.

Igor Shevnin : Masalah utama adalah kurangnya standarisasi, sampai-sampai banyak yang mengganti perpustakaan standar dengan salah satu alternatif yang tidak kompatibel. Ada ketidaksepakatan dalam komunitas tentang apa yang seharusnya menjadi perpustakaan standar, apa yang harus dimasukkan dalam inti bahasa, dan apa yang harus dilengkapi dengan ekstensi, dan bagi saya tampaknya hal ini memperlambat perkembangan bahasa.

Denis Mirzoev : Tidak ada cukup alat: tidak ada IDE lengkap, ada sangat sedikit alat untuk mengukur kinerja, tidak ada debugging "langkah demi langkah" - ini umumnya merupakan masalah mendasar.

Untuk proyek mana Haskell paling cocok?


Yuri Syrovetsky : Untuk tugas-tugas kompleks yang terkait dengan keamanan atau uang, di mana biaya kesalahan tinggi.

Doctor_Ryner : Untuk semua yang Anda perlukan untuk melakukan perhitungan, transformasi, dan analisis data. Sangat terkejut bahwa Haskell kurang populer dalam Ilmu Data daripada Python.

Igor Shevnin : Saya tidak akan mengambil risiko menggunakannya untuk sistem embedded (kinerjanya tidak buruk, tetapi masih ada overhead yang signifikan untuk konsumsi memori karena perhitungan yang malas) dan skrip kecil (kekakuan ini tidak diperlukan di sana). Anda juga perlu memahami bahwa menemukan pengembang dalam tim jauh lebih sulit daripada untuk bahasa umum.

John Doe : Untuk menulis kode industri yang akan dibaca orang lain, Anda memerlukan seluruh tim Haskellists. Beberapa orang berhasil mengumpulkan.

Igor Shevnin : Tetapi karena singkat dan kerasnya, Haskell cocok untuk hampir semua tugas.

Memulai belajar pengembangan dengan Haskell adalah ide yang bagus?


Igor Shevnin: Tidak mungkin untuk memulai, karena sebagian besar basis kode yang harus dikerjakan seseorang tidak tertulis di dalamnya.

John Doe : Ide buruk, buruk! Bahasa bukan dari keluarga ML - tetapi dari bahasa industri pada umumnya - kemudian akan mengejutkan Anda.

Denis Mirzoev : Biasanya, orang pertama belajar matematika, kemudian beralih ke pemrograman. Oleh karena itu, belajar bahasa menggunakan konsep matematika (tipe data aljabar, fungsi murni) harus lebih sederhana daripada keharusan. Yaitu, saya pikir ini adalah ide yang bagus.

Doctor_Ryner : Semua pendatang baru yang saya latih, saya pasti akan memperkenalkan Anda pada Haskell. Orang yang belum mempelajari gaya imperatif lebih mudah dinavigasi dalam kode fungsional dan belajar lebih cepat, bahkan jika mereka bekerja dengan bahasa berorientasi objek, mereka membawa solusi arsitektur yang baik dan praktik fungsional.

Yuri Syrovetsky : Lebih baik memulai dengan beberapa bahasa yang berbeda secara mendasar, misalnya, C, Haskell dan Smalltok, dalam urutan apa pun. Tidak ada satu bahasa pun di
secara terpisah tidak akan memberikan pemahaman penuh.

Haskell adalah bahasa yang cukup lama. Apakah itu baik atau buruk?


Yuri Syrovetsky: Bahasa berkembang sangat aktif, beban kompatibilitas hanya demi kompatibilitas tidak menarik.

John Doe : Standar ini diadopsi pada tahun 1998, tetapi ini tidak terlihat: sampai sekarang, versi baru dari kompiler, berpotensi melanggar kompatibilitas, dirilis kira-kira setiap enam bulan.

Denis Mirzoev : Haskell tidak tua, tetapi sudah teruji waktu. Perubahan tanpa berpikir tidak akan pernah masuk ke bahasa. Jadi agak bagus.

Haskell dikatakan sebagai salah satu bahasa yang paling kompleks. Benarkah begitu?


Doctor_Ryner : Seperti bahasanya sendiri, tidak. Lebih mungkin adalah abstraksi yang digunakan di dalamnya. Seseorang yang belum pernah melihat kode Haskell dapat menjadi gila dengan aliran informasi baru dan berbagai konstruksi yang tidak biasa.

Minyak menambah api bahwa bahasa memaksakan banyak "batasan", tidak memungkinkan atau sangat menyulitkan banyak hal yang tidak sesuai dengan konsep fungsional.

John Doe : Untuk proyek dasar pertama yang setidaknya harus dikompilasi, butuh hampir dua bulan untuk merokok buku pelajaran, manual dan tutorial di malam hari. Benar, setelah dikompilasi, proyek segera mulai bekerja dan buah ara di bawah beban penuh (6k rps dengan puncak hingga 15) selama enam bulan, tanpa perubahan sama sekali.

Denis Mirzoev : Saya bertaruh bahwa jika seorang siswa mulai belajar pemrograman dari Haskell dan bergerak cukup jauh, maka pemrograman imperatif akan membuatnya lebih rumit dan kurang intuitif.

Igor Shevnin : Kompleksitasnya relatif. Dari bahasa-bahasa utama, saya masih menemukan C ++ yang paling kompleks. Bahasa untuk membuktikan teorema (Agda, Coq) akan lebih rumit daripada Haskell dalam arti konseptual. Haskell adalah bahasa yang sederhana, tetapi pola dan perpustakaannya - standar dan pihak ketiga - dapat dipelajari dengan segera.

Apakah kompleksitasnya selalu dibenarkan?


Igor Shevnin : Pola dan abstraksi tingkat tinggi dibenarkan, karena membuat kode lebih dapat diandalkan dan lebih pendek. Tapi saya pikir operator, nama fungsi, dan banyak hal lainnya bisa lebih jelas.

Doctor_Ryner : Seringkali, konstruksi Haskell yang kompleks memungkinkan Anda untuk membuat solusi yang sangat singkat, yang juga ternyata sangat fleksibel dan modular.

Yuri Syrovetsky : Kecuali bahwa mengelola efek itu rumit, meskipun hampir
itu selalu lebih baik daripada kurangnya kontrol. Tetapi terlalu menyederhanakannya
pekerjaan sedang berlangsung.

John Doe : Bahasa bagi mereka yang terbiasa dengan python / php / apa pun yang umumnya membuatnya tampak ortogonal dengan kenyataan. Bagi orang-orang yang awalnya tidak tertarik pada teori kategori, mencapai hasil dari nol absolut sangat sulit.

Tetapi ketika Anda mengerti bahasa, Anda mendapatkan cara baru untuk berpikir tentang masalah yang sedang dipecahkan.

Haskell tampaknya menjadi bahasa untuk matematikawan, bukan pengembang. Apakah Anda pikir itu tidak menyebar karena ini?


Denis Mirzoev : Ini adalah demonstrasi prinsip yang diikuti oleh pengembang utama Haskell - “hindari kesuksesan dengan segala cara”. Intinya, tentu saja, bukan untuk menghindari kesuksesan, tetapi untuk menghindari kesuksesan, yang harganya terlalu tinggi.

Haskell bisa dipopulerkan. Misalnya, ada dukungan untuk bahasa ini dari Microsoft. Itu mungkin untuk membuat bahasa lebih penting, untuk membuat beberapa keputusan cepat dan salah dipahami untuk mendapatkan popularitas. Itu mungkin untuk menggunakan banyak trik kotor, tetapi berkat posisi yang tepat dari pengembang utama tidak ada yang seperti ini.

Ya, popularitas bahasanya tidak terlalu tinggi, tetapi kualitasnya tidak menurun. Keuntungan Haskell dibandingkan bahasa imperatif jelas bagi saya, sebagian besar masalahnya dapat dipecahkan, jadi saya yakin bahwa popularitas besar akan datang seiring perkembangannya.

Yuri Syrovetsky : Jadi dia hanya dilihat oleh orang-orang yang tidak tahu apa-apa tentang dia. Masuk
Haskell telah menggunakan pengembangan "nyata" untuk waktu yang lama, contoh-contoh mudah ditemukan
mesin pencari favorit Anda. Secara khusus, kami menggunakan LC
Haskell puas, dan kita tidak melihat apa pun di tempatnya.

Igor Shevnin : Apa itu "bahasa untuk ahli matematika" Saya benar-benar tidak tahu. Ini dapat berupa R / MatLab / Mathematica untuk perhitungan dan statistik, atau Python, karena sederhana dan membutuhkan lebih sedikit latar belakang teknik. Tapi tidak dengan Haskell. Konsep aljabar seperti monoids digunakan di dalamnya untuk alasan praktis, dan bukan hanya untuk kekakuan tambahan.

Peran utama dalam popularitas dimainkan oleh prevalensi historis C / C ++ / Java / C # di perusahaan, mereka menempati ceruk. Tetapi sekarang, banyak perusahaan mulai menggunakan Haskell dan bahasa fungsional lainnya.

Apa yang akan Anda bandingkan dengan Haskell dan menguntungkan siapa?


John Doe : Lebih atau kurang umum - dengan Erlang. Tetapi Erlang masih lebih mudah untuk ditulis dan lebih mudah dipelajari, menurut saya.

Denis Mirzoev : Saya tahu C, C ++, Java dan Haskell dengan baik. C ++ bahkan tidak perlu dibandingkan dengan apapun, bahasanya mengerikan. C adalah bahasa yang baik untuk pengembangan tingkat rendah. Di ceruk ini, dia akan lebih baik. Kalau tidak, saya lebih suka Haskell.

Pilihan antara Java dan Haskell sudah lebih sulit, tetapi di sini Anda juga perlu melihat tugas tertentu. Untuk android di Haskell kemungkinan besar akan sulit untuk menulis, dalam hal ini Java lebih baik. Tetapi server untuk menulis di Haskell hampir senyaman di Jawa. Jika lingkungan memungkinkan - penyetelan, aksesibilitas perpustakaan - maka saya biasanya memilih Haskell.

Doctor_Ryner : Dengan C #, cukup google cara mengimplementasikan Mungkin di C # dan di Haskell. Sangat aneh bahwa diktatorial yang berfungsi murni Haskell terasa jauh lebih fleksibel dan bebas. Sebenarnya, ini adalah dua ekstrem.

C # adalah salah satu bahasa yang paling berorientasi objek, dan manfaat dari Haskell sangat kontras dengan itu. Di C # Anda terus-menerus harus menulis banyak hal yang tidak perlu, dan semua ini sangat tidak menyenangkan. Menggunakan fungsi tingkat tinggi dapat merusak kode dalam hal sintaksis. Di tengah semua ini, sudah sulit untuk kembali dari solusi pendek dan elegan Haskell.

Igor Shevnin : Dengan Rust, sejauh ini mendukung Rust. Dibutuhkan banyak dari Haskell dan bahasa FP lainnya, tetapi pada saat yang sama pendekatan fungsional ramah dengan imperatif, dan pengembang dan komunitas jauh lebih kompeten dan lebih konsisten dalam mengembangkan bahasa sejak awal.

Apa pendapat Anda tentang komunitas Haskellist?


John Doe : Sebagian besar adalah orang-orang yang sangat ramah yang selalu siap membantu. Perbedaan yang bagus dari komunitas banyak bahasa lainnya.

Doctor_Ryner : Komunitas Haskell sering berisi orang-orang pintar yang menakutkan yang selalu siap membantu. Bukan tanpa alasan meme lokal tentang PhD, teori kategori, dan akademisi ikut. Jika Anda masuk ke obrolan dalam bahasa lain, Anda melihat bahwa orang-orang sedang mendiskusikan masalah produksi biasa dan struktur data. Dalam obrolan Haskell, monad, lemma Yoneda, fungsi aplikatif, menulis tipe gila, dan sebagainya, segera muncul di depan Anda.

Anda segera melihat begitu banyak hal baru yang tidak Anda ketahui sebelumnya - komposisi gila, transformasi dan transformasi elegan, solusi untuk masalah yang menempati puluhan baris dalam bahasa umum, hampir dalam satu baris.

Mereka mengatakan kaum Haskell sombong. Benar?


Denis Mirzoev : Ya. Menurut saya kesombongan disebabkan oleh kenyataan bahwa mereka benar-benar mencintai bahasa mereka dan kesal dengan perkiraan yang terlalu rendah.

John Doe : Nifiga seperti itu.

Doctor_Ryner : Kemungkinan besar, pendapat ini telah hilang, karena fakta bahwa banyak pengembang arus utama sangat jengkel ketika Haskelists mulai berbicara tentang pemrograman fungsional dan keuntungannya. Kesalahpahaman yang mengerikan, pada gilirannya, dapat mengganggu Haskelist sendiri, dan ia akan mulai terburu-buru dalam hal ini, yang ia distigma oleh FAQ.

Igor Shevnin : Arogansi kata yang terlalu kuat. Intinya di sini adalah bahwa FP, OOP, perbedaan antara kelas-kelas OOP dan tipe-tipe serikat pekerja, masalah perluasan, dan banyak konsep lain pernah menambah gambaran yang sangat jelas, dan setelah itu menjadi sulit untuk memahami orang-orang yang mencoba menentang OOP dan FI atau membayangkan masalah luas dalam perspektif yang sempit.

Mengapa bahasa FP masih niche?


Denis Mirzoev : Keuntungan mereka masih belum cukup untuk menarik banyak programmer. Kesulitan dalam belajar tidak kondusif untuk popularitas. Masalah dengan penyetelan juga membuat takut banyak orang, tetapi bagi saya kelihatannya meningkatkan ukuran komunitas bisa menyelesaikan masalah ini. Ternyata lingkaran setan.

Igor Shevnin : Niche secara bertahap berlalu, dan konsep fungsional ditarik ke bahasa lain.

Doctor_Ryner : Prinsip-prinsip fungsional itu sendiri dan bahasa yang mendukungnya sudah ada di mana-mana. Bahkan untuk benda tajam, ada Linq dan beberapa perpustakaan lainnya. Ceruk adalah bahasa yang agak murni fungsional, karena mereka menggunakan konsep non-standar.

Jangan lupa bahwa 20 tahun yang lalu, besi tidak cukup produktif untuk bahasa fungsional, sehingga fungsionalisme mulai memasuki arus utama dalam beberapa tahun terakhir, dan minat pada Haskell hanya tumbuh.

Source: https://habr.com/ru/post/id438970/


All Articles