Akhir-akhir ini saya perhatikan bahwa bahasa pemrograman fungsional mulai populer . Baru-baru ini saya melihat bagaimana Indeks Tiobe menunjukkan peningkatan popularitas mereka dibandingkan dengan tahun lalu meskipun kebanyakan dari mereka bahkan tidak mencapai 50 bahasa terpopuler menurut indeks ini.
Dan ini sudah cukup lama terjadi. Pemrograman fungsional tidak menjadi sepopuler model lainnya (yaitu pemrograman berorientasi objek).
Saya telah melihat minat terlahir kembali pada kekuatan pemrograman fungsional, dan sekarang multicores semakin populer, pengembang mulai menunjukkan minat pada model konkurensi lain yang telah dieksplorasi di masa lalu oleh bahasa-bahasa seperti Haskell dan Erlang.
Saya melihat dengan minat besar fakta bahwa meskipun kurangnya penerimaan masyarakat yang signifikan, semakin banyak bahasa seperti ini terus muncul. Clojure (2007), Scala (2003), F # (2002) hanyalah tiga contoh dekade terakhir ini.
Saya sendiri, telah menginvestasikan waktu untuk belajar Haskell dan Scala. Dan saya menemukan potensi besar dalam paradigma yang bagi saya baru meskipun sudah ada di sana begitu lama.
Dan tentu saja, pertanyaan terbesar saya adalah apakah salah satu dari ini akan menjadi cukup populer untuk mempertimbangkan upaya apa pun di dalamnya, tetapi ini adalah pertanyaan yang bahkan tidak bisa dijawab oleh Mandrake, meskipun semua keributan yang dilakukan orang tentang mereka.
Yang ingin saya tanyakan adalah:
- Dalam skenario mana saya harus mempertimbangkan bahasa pemrograman fungsional yang lebih cocok untuk melakukan tugas yang diberikan? Selain masalah multicore yang baru-baru ini populer pemrograman paralel.
- Jika saya memutuskan untuk beralih ke bahasa pemrograman fungsional yang akan Anda anggap sebagai jebakan terbesar yang akan saya hadapi? (Selain perubahan paradigma dan kesulitan untuk mengevaluasi kinerja karena evaluasi malas).
- Dengan begitu banyak bahasa pemrograman fungsional di luar sana, bagaimana Anda memilih yang lebih sesuai dengan kebutuhan Anda?
Setiap rekomendasi untuk penelitian lebih lanjut akan sangat disambut.
Saya telah mencari di web untuk pendapat, dan tampaknya semua popularitas pembaruan ini berasal dari gagasan bahwa sekarang kita akan menabrak tembok Hukum Moore dan bahasa pemrograman fungsional akan datang dan secara heroik menyelamatkan kita. Tetapi jika ini masalahnya, saya akan mengatakan ada lebih banyak kemungkinan bahasa populer yang ada beradaptasi dengan paradigma.
Beberapa dari Anda, dengan lebih banyak pengalaman bekerja setiap hari dengan bahasa-bahasa ini mungkin, dapat menawarkan lebih banyak wawasan tentang masalah ini. Semua pendapat Anda akan lebih dihargai dan dipertimbangkan dengan cermat.
Terima kasih sebelumnya!
Jawaban:
Apa pun yang melibatkan pembuatan urutan elemen data turunan menggunakan sejumlah langkah transformasi.
Pada dasarnya, "masalah spreadsheet". Anda memiliki beberapa data awal dan kumpulan perhitungan baris-demi-baris untuk diterapkan pada data itu.
Aplikasi produksi kami melakukan sejumlah ringkasan statistik data; ini semua terbaik didekati secara fungsional.
Satu hal umum yang kami lakukan adalah gabungan dari tiga set data yang mengerikan. Mirip dengan gabungan SQL, tetapi tidak digeneralisasikan. Ini diikuti oleh sejumlah perhitungan data turunan. Ini semua hanya transformasi fungsional.
Aplikasi ini ditulis dalam Python, tetapi ditulis dalam gaya fungsional menggunakan fungsi generator dan tuple bernama abadi. Ini adalah komposisi fungsi tingkat bawah.
Inilah contoh konkret dari komposisi fungsional.
Ini adalah salah satu cara pemrograman fungsional memengaruhi bahasa seperti Python.
Terkadang hal semacam ini ditulis sebagai:
Benda yang tidak bisa berubah adalah rintangan terberat.
Seringkali Anda akan berakhir dengan menghitung nilai yang membuat objek baru alih-alih memperbarui objek yang ada. Gagasan bahwa itu adalah atribut yang bisa berubah dari suatu objek adalah kebiasaan mental yang sulit untuk dihancurkan.
Properti turunan atau fungsi metode adalah pendekatan yang lebih baik. Benda stateful adalah kebiasaan yang sulit untuk dihentikan.
Awalnya tidak masalah. Pilih bahasa apa saja untuk dipelajari. Setelah Anda mengetahui sesuatu, Anda berada dalam posisi untuk memilih yang lain agar lebih sesuai dengan kebutuhan Anda.
Saya sudah membaca tentang Haskell hanya untuk memahami hal-hal yang tidak dimiliki Python.
sumber
"Fungsional" adalah banyak fitur yang berbeda, yang masing-masing secara mandiri berguna, dan saya merasa lebih berguna untuk melihat masing-masing secara individual.
Kekekalan
Sekarang saya sudah mengenalnya, kapan saja saya bisa mengembalikan hasil yang tidak berubah, saya selalu mencoba melakukan itu, bahkan dalam program berorientasi objek. Lebih mudah untuk berpikir tentang program jika Anda memiliki data tipe nilai. Biasanya Anda membutuhkan kemampuan untuk hal-hal seperti GUI dan bottleneck kinerja. Entitas saya (menggunakan NHibernate) juga bisa berubah (yang masuk akal karena mereka memodelkan data yang disimpan dalam database).
Berfungsi sebagai Tipe Kelas Satu
Apa pun yang Anda ingin menyebutnya, membagikan delegasi, tindakan, atau fungsi, adalah cara yang sangat berguna untuk menyelesaikan seluruh kelas masalah dunia nyata, seperti "hole in the middle pattern". Saya juga menemukan bahwa mengirimkan delegasi, tindakan, atau fungsi ke objek lebih bersih daripada meminta kelas tersebut mendeklarasikan suatu peristiwa dan mengaitkan peristiwa itu (dengan asumsi biasanya hanya ada satu "pendengar"). Ketika Anda tahu ada satu pendengar, maka tindakan panggil balik dapat dilewatkan sebagai parameter konstruktor (dan disimpan dalam anggota yang tidak dapat diubah!)
Mampu menyusun fungsi (misalnya berubah
Action<T>
menjadi hanyaAction
juga sangat berguna dalam beberapa skenario.Kami juga harus mencatat sintaks Lambda di sini, karena Anda hanya mendapatkan sintaks Lambda ketika Anda mempromosikan fungsi ke tipe kelas satu. Sintaks Lambda bisa sangat ekspresif dan ringkas.
Monad
Memang, ini adalah titik lemah saya, tetapi pemahaman saya adalah bahwa alur kerja komputasi di F #, seperti
async
alur kerja, adalah monad. Ini adalah konstruksi yang halus tetapi sangat kuat. Ini sama kuatnya denganyield
kata kunci yang digunakan untuk membuatIEnumerable
kelas di C #. Pada dasarnya itu membangun mesin negara untuk Anda di bawah selimut, tetapi logika Anda terlihat linier.Evaluasi & Rekursi Malas
Saya menyatukan ini karena sementara mereka selalu disatukan sebagai fitur pemrograman fungsional, mereka telah membuat jalan mereka begitu cepat ke dalam bahasa-bahasa yang sangat penting sehingga sulit untuk menyebut mereka fungsional lagi.
S-Ekspresi
Saya kira saya tidak yakin di mana harus meletakkan ini, tetapi kemampuan untuk memperlakukan kode yang tidak dikompilasi sebagai objek (dan memeriksanya / memodifikasinya), seperti Lisp S-Expressions, atau LINQ Expressions, dalam beberapa hal, alat pemrograman fungsional yang paling kuat. Sebagian besar antarmuka .NET "lancar", dan DSL, menggunakan kombinasi sintaks lambda dan Ekspresi LINQ untuk membuat beberapa API yang sangat ringkas. Belum lagi Linq2Sql / Linq2Nhibernate di mana kode C # Anda "secara ajaib" dieksekusi sebagai SQL dan bukan sebagai kode C #.
Itu adalah jawaban panjang untuk bagian pertama dari pertanyaan Anda ... sekarang ...
Jebakan terbesar yang saya hadapi adalah mencoba menemukan garis antara menggunakan solusi fungsional vs solusi imperatif. Namun, setelah mencoba kedua pendekatan beberapa kali, Anda mulai merasakan yang akan bekerja lebih baik.
Jika Anda terbiasa dengan .NET, saya sangat menyarankan F #. Di sisi lain, jika Anda lebih terbiasa dengan JVM, selalu ada Clojure . Jika Anda lebih akademis daripada praktis, maka saya akan menggunakan Common Lisp atau Scheme. Jika Anda sudah tahu Python, saya percaya ada banyak konstruksi fungsional yang sudah tersedia di sana.
sumber
Ini benar jika Anda menghitung program yang dikembangkan oleh pemrogram profesional (atau setidaknya orang yang melihat diri mereka seperti itu). Jika Anda menyebarkan jaring Anda lebih luas untuk memasukkan program yang dikembangkan oleh orang-orang yang tidak menganggap dirinya demikian, FP (atau paling tidak pemrograman dengan gaya fungsional) cukup dekat dengan OO (Excel, Mathematica, Matlab, R ... bahkan JavaScript 'modern' ).
Pendapat pribadi saya adalah bahwa multicore bukanlah fitur pembunuh FP (setidaknya sampai Haskell, Scala, Clojure, kompiler F # menyelesaikan masalah cache locality). Fitur pembunuh adalah
map
,filter
,fold
dan teman-teman yang memungkinkan ekspresi yang lebih ringkas dari kelompok besar algoritma. Ini diperparah oleh bahasa FP yang memiliki sintaksis yang lebih ringkas daripada kebanyakan mitra OO.Selain itu FP yang lebih dekat ke model relasional mengurangi ketidakcocokan impedansi dengan RDBMS ... yang - sekali lagi setidaknya untuk non-programmer - sangat bagus.
Juga ketika Anda memiliki sangat sulit untuk memenuhi persyaratan 'kebenaran' - dalam bentuk yang sulit untuk diuji (umum dalam komputasi ilmiah / analisis data besar di mana tujuannya adalah untuk mendapatkan yang sebelumnya tidak diketahui dan dengan demikian hasil yang tidak ditentukan) FP dapat menawarkan keuntungan.
Berapa banyak masalah Anda yang dapat diselesaikan dengan sudah keluar dari perpustakaan / kerangka kerja pada platform mana (misalnya JVM atau .Net) berapa banyak yang baru? Apakah ada konstruksi bahasa yang mampu mengekspresikan masalah ini secara langsung?
Berapa banyak kontrol tingkat rendah yang Anda butuhkan atas kinerja ruang dan waktu aplikasi Anda?
Seberapa ketat persyaratan "kebenaran" Anda?
Dapatkah Anda mampu melatih kembali pengembang dan / atau bersaing dengan manfaat yang ditawarkan oleh beberapa ceruk yang sangat menguntungkan dalam pengembangan SW?
sumber
Dengan asumsi Anda adalah seorang C ++ / C # / pengembang Java di industri ...
Bersiaplah untuk teman sebaya pemarah yang tidak ingin belajar apa pun. Bersiaplah untuk bos berambut runcing memaksakan pilihan bahasa yang buruk "karena mereka adalah seorang programmer sekali". Bersiaplah untuk akademisi yang penuh semangat di forum-forum yang melindungi Anda tentang monoids. Bersiaplah untuk perang bahasa tanpa akhir karena Scala bahkan tidak memiliki eliminasi panggilan ekor dan Clojure benar-benar membutuhkan pedal kaki untuk semua kurung dan jangan mulai saya menggunakan Erlang.
Jika Anda seorang programmer web maka jebakan terbesar mungkin adalah rambut Anda.
Saya akan mulai dengan platform:
sumber
Untuk satu perspektif (yang memang bias) pada pertanyaan ini, Anda dapat melihat blog Bob Harper, Existential Type . Carnegie Mellon baru-baru ini mengerjakan ulang kurikulum CS mereka untuk mengajarkan pemrograman fungsional terlebih dahulu, dengan paradigma lain diajarkan hanya setelah landasan yang kuat dalam pemrograman fungsional telah didirikan, dan Harper memberikan pukulan-per-pukulan ketika kurikulum baru diluncurkan dalam praktik .
Harper adalah salah satu pengembang utama bahasa pemrograman ML Standar, jadi wajar untuk mengatakan pendapatnya sendiri tentang masalah ini dapat ditebak sebelumnya, dan dia tentu saja tidak malu dengan pernyataan kontroversial dalam memperdebatkan posisi ini, tetapi dia membuat kasusnya dengan baik.
sumber
var
atau koleksi yang bisa berubah satu kali saja. Jadi, pemikiran imperatif adalah IMO semacam optimasi prematur yang, seperti kita semua tahu, adalah akar dari semua kejahatan.Tidak ada rumus ajaib yang memberi tahu Anda kapan harus menggunakan pemrograman fungsional. Ini tidak seperti pemrograman berorientasi objek yang cocok untuk situasi pemrograman kita saat ini lebih baik. Ini hanyalah cara lain untuk menyusun program dalam bentuk serangkaian abstraksi lainnya.
Pemrograman fungsional tidak ada hubungannya dengan kemalasan. ML dan OCaml adalah bahasa yang fungsional dan ketat. Rintangan terbesar yang akan Anda hadapi adalah menyusun hal-hal berdasarkan nilai-nilai yang tidak dapat diubah dan membungkus kepala Anda dengan abstraksi apa pun yang digunakan dalam sistem tipe untuk efek samping. Bahasa fungsional lebih cocok untuk optimasi karena fakta bahwa mereka membuat efek samping sangat eksplisit dalam sistem tipe. Haskell menggunakan monads tetapi ada pendekatan lain untuk menggunakan efek dalam bahasa fungsional murni. Bersih memiliki tipe keunikan dan beberapa bahasa lain dalam pengembangan memiliki hal-hal lain.
Di antara bahasa pemrograman saya sadar saya akan mengatakan hanya Haskell dan Clean dapat disebut bahasa fungsional. Semua yang lain memungkinkan efek samping tanpa membuat efek tersebut eksplisit di sistem tipe. Jadi jika Anda akan mencurahkan waktu untuk mempelajari pemrograman fungsional maka Haskell mungkin satu-satunya yang sesuai dengan tagihan. Semua yang saya tahu, Erlang, Scala, Clojure, dll. Hanya menyediakan abstraksi fungsional di atas bahasa imperatif. Jadi jika Anda ingin mendekati paradigma fungsional dalam bit maka saya akan merekomendasikan Scala atau Erlang dan jika Anda ingin mengatasi semuanya sekaligus dan mungkin menyerah dalam frustrasi maka Anda harus pergi dengan Haskell.
sumber
Saya akan menghubungkan peningkatan minat saat ini dalam bahasa fungsional dengan fakta bahwa mereka ideal untuk komputasi paralel. Misalnya seluruh gagasan pengurangan peta didasarkan pada paradigma fungsional. Dan tidak ada keraguan bahwa komputasi paralel akan meningkat, karena jelas bahwa peningkatan skala saat ini jauh lebih mudah dan lebih murah daripada peningkatan skala. Bahkan di pasar konsumen, CPU mendapatkan lebih banyak core, bukan lebih banyak GHz.
EDIT: karena tidak jelas untuk semua.
Dalam pemrograman fungsional murni fungsi mengambil input, menghasilkan output dan tidak memiliki efek samping. Tidak memiliki efek samping, berarti tidak memiliki status berbagi, sehingga tidak perlu mekanisme sinkronisasi, yang sebaliknya akan diperlukan saat berjalan secara bersamaan. Sinkronisasi adalah bagian yang paling sulit dari perangkat lunak konkuren / paralel, sehingga melakukannya murni fungsional, pada dasarnya Anda tidak harus berurusan dengan bagian yang paling sulit sama sekali.
Adapun pengurangan peta, bahkan namanya berasal dari pemrograman fungsional (baik pemetaan dan pengurangan adalah operasi khas dalam paradigma fungsional). Kedua langkah pengurangan peta adalah fungsi, yang berjalan secara paralel, mengambil input, menghasilkan output dan tidak memiliki efek samping. Jadi ini adalah ide pemrograman fungsional murni.
Beberapa contoh FP yang digunakan untuk paralelisme:
sumber