Saya melihat menyelam ke Haskell untuk proyek pribadi saya berikutnya (relatif sepele). Alasan saya menangani Haskell adalah:
- Dapatkan kepalaku ke bahasa yang murni fungsional
- Kecepatan. Meskipun saya yakin ini bisa diperdebatkan, membuat profil yang saya lihat paku Haskell dekat dengan C ++ (dan tampaknya sedikit lebih cepat daripada Erlang).
- Kecepatan. Server web Warp tampaknya sangat cepat gila dibandingkan dengan yang lainnya .
Jadi, mengingat ini, apa yang saya cari adalah kelemahan atau masalah yang menyertai Haskell. Web memiliki sejumlah besar informasi tentang mengapa Haskell adalah Good Thing, tetapi saya belum menemukan banyak topik tentang sisi buruknya (terlepas dari keluhan tentang sintaksisnya yang tidak saya pedulikan sama sekali).
Contoh dari apa yang saya cari bisa seperti Python GIL. Sesuatu yang tidak mendukungnya sampai saya benar-benar mulai melihat menggunakan konkurensi dalam lingkungan CPython.
Jawaban:
Beberapa kerugian yang dapat saya pikirkan:
sumber
Sebagian besar kerugian Haskell (dan juga sebagian besar kelebihan Haskell) berasal dari dua karakteristik yang menentukan: Ini malas dan murni fungsional.
Menjadi malas membuat lebih sulit untuk berpikir tentang kinerja. Khususnya untuk orang-orang yang tidak terbiasa dengan kemalasan, tetapi bahkan untuk Haskellers yang berpengalaman, akan sulit untuk melihat bagaimana kemalasan akan memengaruhi kinerja dalam kasus-kasus tertentu.
Kemalasan juga berarti bahwa lebih sulit untuk membuat tolok ukur yang akurat tanpa menggunakan perpustakaan seperti Kriteria.
Menjadi fungsional murni berarti bahwa setiap kali Anda perlu menggunakan struktur data yang bisa berubah-ubah (dalam kasus di mana tidak mungkin untuk mencapai kinerja yang diinginkan tanpa mereka - meskipun berkat pengoptimal GHC yang tidak terjadi sesering yang Anda bayangkan), Anda akan menjadi terjebak di monad IO (atau ST), yang membuat kode lebih rumit.
Karena Anda menyebut kecepatan sebagai salah satu tujuan Anda, saya harus menunjukkan bahwa seringkali ada perbedaan besar dalam kinerja antara kode Haskell yang dioptimalkan dengan tangan dan kode Haskell yang ditulis tanpa terlalu memikirkan kinerja (lebih daripada dalam bahasa lain). Dan kode Haskell yang dioptimalkan dengan tangan sering kali sangat jelek (meskipun saya kira itu juga berlaku di sebagian besar bahasa lain).
sumber
Saya bukan ahli Haskell: Saya telah mempelajari dasar-dasarnya tetapi sayangnya saya belum memiliki kesempatan untuk melakukan beberapa proyek serius di Haskell (saya ingin, karena saya suka bahasa ini).
Namun, dari apa yang saya ketahui dan dari diskusi dengan seseorang yang telah bekerja di bidang yang cukup dekat dengan pemrograman fungsional, Haskell mungkin bukan solusi terbaik ketika Anda ingin menerapkan algoritma grafik, di mana Anda perlu misalnya berjalan melalui grafik dan melakukan banyak perubahan lokal pada struktur grafik.
Karena grafik tidak memiliki struktur rekursif secara umum, perasaan saya adalah bahwa pendekatan terbaik adalah membangun satu salinan grafik menggunakan struktur dan pointer di antara mereka (seperti yang dapat Anda lakukan misalnya dalam C ++) dan memanipulasi salinan itu dengan mengubah pointer, membuat atau menghancurkan node, dan sebagainya.
Saya bertanya-tanya bagaimana struktur dan operasi data tersebut dapat ditangani dengan benar di Haskell, karena sepengetahuan saya di Haskell tidak mungkin menggunakan representasi / pendekatan di atas. Beberapa masalah dengan algoritma grafik di Haskell dibahas secara singkat di artikel ini
SUNTING
Saya baru-baru ini berbicara dengan seorang ahli pemrograman fungsional dan dia mengkonfirmasi bahwa menerapkan algoritma grafik tertentu secara efisien bisa sangat rumit di Haskell: bergerak di sekitar pointer seperti yang Anda lakukan di C atau C ++ bisa jauh lebih cepat.
sumber
Sisi negatif dari Haskell adalah berbeda. Ini adalah langkah lebih besar dari bahasa yang lebih umum diajarkan atau dibicarakan, sehingga akan ada kurva belajar yang lebih besar. Bahasa ini juga kurang populer dari bahasa yang dapat membatasi ketersediaan bantuan jika Anda mengalami kesulitan. Ini sebenarnya bukan kerugian besar.
Satu hal yang menjadi kelemahan potensial adalah bahasa fungsional, sehingga kurang bermanfaat untuk domain masalah tertentu, tetapi ini juga berlaku untuk bahasa berorientasi objek. Secara umum bahasa tidak memiliki negatif sebenarnya di luar kurva belajar, setidaknya untuk bahasa yang relatif populer. Selama bahasa Turing lengkap, secara teori ia mampu melakukan apa saja.
sumber
"Masalah dengan Haskell" cenderung muncul di domain tertentu. Haskell adalah bahasa yang bagus untuk pemrograman aplikasi, jauh lebih menyenangkan untuk ditulis daripada hal lainnya. Masalahnya cenderung muncul ketika Anda mencoba melakukan sesuatu yang tidak memiliki dukungan yang baik, seperti:
sumber