Jawaban:
Satu masalah utama adalah bahwa jika Anda mulai dengan bahasa seperti Haskell, semua yang lain akan tampak di bawah standar.
Jujur saya pikir memulai dengan bahasa seperti Haskell atau skema akan menjadi ide bagus.
(Saya akui saya pecandu bahasa fungsional) EDIT:
OK apa yang saya suka dari kedua bahasa:
Skema mengambil bahasa yang sangat sederhana dan membangunnya dari bahasa yang sangat kuat untuk pengembangan. Juga SICP ditulis tentang skema yang membuatnya layak dipelajari di sana. Skema adalah tentang hal paling sederhana yang dapat Anda bayangkan yang bisa menjadi bahasa yang lengkap.
Haskell Yang benar-benar berkembang pada saya adalah sistem tipe. Begitu banyak bug yang saya lihat dalam bahasa lain karena jenis yang salah muncul di suatu tempat. Dalam Haskell itu hampir mustahil. Juga gagasan tentang bahasa malas hanya memiliki beberapa hal keren yang keluar darinya. Misalnya Anda dapat membuat struktur data tak terbatas di Haskell dan kemudian hanya membuat bagian yang Anda butuhkan.
Kelebihan terbesar dari mempelajari bahasa fungsional sebelum mempelajari bahasa OOP adalah bahwa keterampilan pemrograman Anda dikembangkan terlebih dahulu dan kemudian Anda dapat dengan mudah memahami konsep-konsep OOP. Jika Anda mulai dengan bahasa OOP, Anda harus belajar dua hal secara bersamaan: "untuk memikirkan kode" dan "untuk memikirkan tentang OOD". Itu bisa mengganggu. Latihan pertama dengan bahasa fungsional dan kembangkan keterampilan pemrograman Anda. Kemudian pelajari OOP dan paradigma lainnya. Karena OOP ingin memperbaiki kekurangan dalam pemrograman struktural, akan lebih mudah untuk memahami alasannya. Itulah alasan kursus CS mulai dengan C dan kemudian pergi ke C ++.
Pada pertanyaan tentang bagaimana mempelajari pemrograman dengan mulai dengan pemrograman fungsional, dua rekomendasi klasik:
Yang pertama, dan jelas adalah Struktur klasik dan Interpretasi Program Komputer , oleh Abelson dan Sussman, yang tetap menjadi salah satu pengantar terbaik untuk CS di luar sana, dan diajarkan dari perspektif fungsional, menggunakan Skema. Ini tersedia secara online penuh . Jika Anda tidak memulai dari sini, Anda harus sampai di sini sebagai poin.
Teks yang lebih baru yang mencakup sebagian besar bidang yang sama dengan kecepatan yang lebih lembut, dan dengan fokus yang lebih kuat pada rekayasa perangkat lunak adalah Cara Mendesain Program , oleh Matthew Felleisen dan banyak lainnya dari tim Racket / PLT, yang menggunakan dialek Racket dari Skema. Ini juga tersedia online , seperti edisi kedua yang sedang dalam proses . Buku ini memiliki keuntungan karena dirancang untuk digunakan dengan lingkungan pemrograman DrRacket, yang menyediakan antarmuka yang sangat ramah bagi pemula dan pakar untuk bereksperimen dengan kode.
Pada pertanyaan mengapa mulai dengan pemrograman fungsional, saya ingin menunjukkan pada Blog Bob Harper . Carnegie Mellon baru-baru ini memperlengkapi kembali kurikulum CS mereka untuk mengajar pemrograman fungsional terlebih dahulu, dan Harper telah meliput kemajuan mereka secara bertahap di blog-nya. Sebagai salah satu orang di belakang definisi Standar ML, jelas bahwa dia untuk langkah ini, dan dia membantah alasannya dengan baik.
Akhirnya, saya memperingatkan untuk tidak mempelajari Haskell terlebih dahulu, meskipun yang lain mungkin tidak setuju. Sementara pendekatan murni Haskell terhadap FP tentu saja akan menghasilkan kebiasaan yang baik, fokus bahasa pada perhitungan malas tidak selalu cocok untuk pemula; salah satu hal pertama, dan yang paling penting yang harus Anda pelajari untuk dilakukan sebagai seorang programmer adalah untuk menjelaskan dengan tepat apa yang sedang dilakukan oleh program Anda dengan melihat sumbernya, dan tentang biaya relatif dari berbagai pendekatan untuk masalah yang sama. Bukan pengalaman saya bahwa kemalasan Haskell membuat kedua kegiatan ini sedikit menjadi tantangan bagi programmer yang bahkan berpengalaman, meskipun Your Mileage May Vary.
Keuntungan utama (atau, tidak merugikan) memulai dengan FP adalah bahwa sebagian besar konsep dapat berlaku untuk pemrograman imperatif juga. Realm of Racket menggunakan analogi video game untuk mengajarkan konsep fungsional dan imperatif, dan siswa yang berdedikasi tidak hanya memiliki game fungsional (npi), tetapi juga pemahaman yang solid tentang persyaratan, rekursi, loop, ADT, dan desain yang digerakkan oleh peristiwa. Konsep-konsep ini praktis ada di mana-mana dalam pemrograman modern dan digunakan terus-menerus.
Namun yang lebih penting adalah mempelajari cara menyandikan abstraksi , sesuatu di mana FP unggul, dengan penggunaan fungsi tingkat tinggi dan tipe data. Cara Mendesain Program mengambil pendekatan unik untuk ini dengan mengajar melalui induksi. Misalnya, siswa belajar cara fold
kerjanya dengan melihat kode untuk mengambil jumlah dan produk dari daftar, menemukan kesamaan apa yang mereka miliki, dan menurunkan implementasinya sendiri.
Setara dengan OOP di atas kemungkinan akan melibatkan satu atau lebih dari yang berikut: antarmuka, kelas abstrak, generik, functors, atau singleton (jika Anda salah melakukannya). Meskipun ini adalah pola desain yang bisa diterima di Jawa, IMHO mereka tidak termasuk dalam kurikulum pengantar dan hanya berfungsi untuk mengaburkan prinsip-prinsip yang mendasarinya. Bahkan sebagai seseorang yang diperkenalkan ke bahasa FP "terlambat", saya dapat mengatakan bahwa menavigasi laut OOP yang selalu berubah telah menjadi jauh lebih mudah dengan memiliki jangkar fungsional yang kuat.
RACKETEERS
. Tidak yakin kapan kedaluwarsa, maaf.
Pemrograman fungsional membuat banyak hal lebih mudah. Dalam bahasa OOP, Anda harus berurusan dengan mengelola negara di banyak utas tanpa merusak keadaan itu. Dalam bahasa fungsional, ketika sebagian besar pekerjaan dilakukan oleh fungsi murni, Anda tidak perlu khawatir.
Dalam hal kecepatan / kinerja, saya bukan joki kinerja nyata, tetapi menjadi fungsional tidak berarti lambat, dan struktur bahasa fungsional tidak ada hubungannya dengan kecepatan mereka. Sintaks bahasa fungsional sangat bervariasi seperti perbedaan antara Clojure dan Haskell. Clojure sangat cepat apa adanya, dan dapat mencapai (dan kadang-kadang melebihi) kecepatan Java dengan optimasi setelah-fakta.
Jadi itu semua sangat tergantung apa yang Anda cari
Saya pikir ketersediaan bahan pembelajaran, beberapa contoh kode yang baik, dan mentor sangat penting ketika belajar bahasa pemrograman. Tergantung pada situasi Anda, Anda mungkin memiliki mentor yang dapat mengajar Anda, dll. Tetapi saya pikir sumber daya bahasa fungsional sangat sedikit dibandingkan dengan bahasa umum. Ini berarti Anda akan mengalami kemajuan lebih lambat dibandingkan dengan belajar bahasa umum. Tetapi jika Anda tidak terburu-buru, maka ini bukan masalah.
Mungkin alasan paling penting untuk mempertimbangkan belajar bahasa pemrograman fungsional adalah pemahaman tipe data aljabar. Pemetaan mental akan membantu dalam pemodelan hubungan kelas OO dan bahkan desain basis data.
Fokus pada sistem multi-core / multi-prosesor menekankan penggunaan algoritma paralel yang dapat dinyatakan lebih jelas dan lebih ringkas dalam FP. Cabang bahasa lambda kemungkinan akan melihat peningkatan penggunaan yang kuat dalam satu hingga dua dekade mendatang.
Tetapi ada juga beberapa perangkap umum. Percaya bahwa KB lebih sederhana adalah kesalahan besar, karena menghitung kompleksitas ruang dan waktu serta memberikan bukti penghentian bisa jauh lebih menantang dalam kalkulus lambda, terutama dalam bahasa yang mendukung evaluasi malas.
Jadi, pelajari keduanya! Atau mungkin lebih baik: pertama-tama pelajari bahasa yang mencakup keduanya, seperti Scala. Jika Anda tidak keberatan dengan kaus oblong dan aksen belanda, mungkin Anda akan menemukan kuliah FP oleh Dr. Erik Meijer bermanfaat, yang ada di MSDN.