Apa keuntungan dari pemrograman fungsional? [Tutup]

96

Menurut Anda, apa manfaat pemrograman fungsional? Dan bagaimana mereka berlaku untuk programmer saat ini?

Apa perbedaan terbesar antara pemrograman fungsional dan OOP?

Rayne
sumber

Jawaban:

75

Gaya pemrograman fungsional adalah mendeskripsikan apa yang Anda inginkan, bukan bagaimana mendapatkannya. yaitu: alih-alih membuat perulangan-ke dengan variabel iterator dan berbaris melalui larik melakukan sesuatu ke setiap sel, Anda akan mengatakan padanan dengan "label ini merujuk ke versi larik ini di mana fungsi ini telah dilakukan pada semua sel elemen. "

Pemrograman fungsional memindahkan lebih banyak ide pemrograman dasar ke dalam kompiler, ide-ide seperti pemahaman daftar dan caching.

Manfaat terbesar dari pemrograman Fungsional adalah singkatnya, karena kode bisa lebih ringkas. Program fungsional tidak membuat variabel iterator menjadi pusat loop, jadi overhead ini dan jenis overhead lainnya dihilangkan dari kode Anda.

Manfaat utama lainnya adalah konkurensi, yang lebih mudah dilakukan dengan pemrograman fungsional karena kompiler menangani sebagian besar operasi yang biasanya memerlukan pengaturan variabel status secara manual (seperti iterator dalam satu loop).

Beberapa manfaat kinerja juga dapat dilihat dalam konteks prosesor tunggal, bergantung pada cara program ditulis, karena sebagian besar bahasa dan ekstensi fungsional mendukung evaluasi malas. Di Haskell Anda bisa mengatakan "label ini mewakili larik yang berisi semua bilangan genap". Larik semacam itu sangat besar, tetapi Anda dapat meminta elemen ke-100.000 dari larik itu kapan saja tanpa harus tahu - pada waktu inisialisasi larik - berapa nilai terbesar yang akan Anda perlukan. Nilainya akan dihitung hanya saat Anda membutuhkannya, tidak lebih.

Chris Wenham
sumber
12
Saya merasa paragraf pertama Anda lebih dekat untuk menggambarkan pemrograman relasional deklaratif seperti Prolog daripada pemrograman fungsional.
McPherrinM
6
@McPherrinM: bahasa fungsional bersifat deklaratif, bukan imperatif.
Lie Ryan
2
Sepertinya Anda bingung antara DP vs. IP, dengan prosedural vs. FP . FP menyediakan pemisahan perhatian dengan menekankan komposisi fungsi, yaitu memisahkan ketergantungan di antara subkomputasi dari komputasi deterministik.
Shelby Moore III
2
@LieRyan salah. Silakan lihat tautan di komentar saya sebelumnya
Shelby Moore III
Konkurensi memiliki banyak utas yang dapat berinteraksi satu sama lain, yang sangat penting. Melakukan beberapa komputasi independen pada saat yang sama disebut paralelisme . Lihat en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy
29

Manfaat terbesarnya adalah Anda tidak terbiasa melakukannya. Pilih bahasa seperti Skema dan pelajari cara memecahkan masalah, dan Anda akan menjadi pemrogram yang lebih baik dalam bahasa yang sudah Anda ketahui. Ini seperti mempelajari bahasa manusia kedua. Anda berasumsi bahwa orang lain pada dasarnya adalah variasi Anda sendiri karena tidak ada yang dapat Anda bandingkan. Paparan kepada orang lain, khususnya yang tidak terkait dengan apa yang sudah Anda ketahui, bersifat instruktif.

Kirk Strauser
sumber
28
itulah manfaat mempelajarinya, bukan manfaat dari paradigma itu sendiri
Moe
2
Tetapi apakah mereka benar-benar terpisah? Dari sudut pandang penanya asli, saya akan mengatakan tidak - mereka kemungkinan besar mencari keuntungan total dari menghabiskan upaya untuk mempelajari bahasa fungsional.
Kendall Helmstetter Gelner
3
"itulah manfaat mempelajarinya, bukan manfaat dari paradigma itu sendiri". Paradigma tersebut akan bocor ke pekerjaan OOP Anda yang lain dan dapat membantu menyederhanakan pengembangan Anda di sana. Anda dapat mendekati masalah dari "hitung keluaran ini dari masukan ini" dan "buat dua fungsi ini yang menghitung data baru" daripada "tunggu --- apa status dari beberapa variabel bersama di sana?" dan "apakah saya mendapatkan prosedur ini untuk dijalankan dalam urutan yang benar?". Serius, Anda mendapatkan manfaat ini (dari memahami paradigma FP) dengan Python, C #, C ++, Java, apa saja.
Jared Updike
11

Mengapa Pemrograman Fungsional Penting
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Abstrak

Karena perangkat lunak menjadi semakin kompleks, maka semakin penting untuk menyusunnya dengan baik. Perangkat lunak yang terstruktur dengan baik mudah untuk ditulis dan di-debug, dan menyediakan sekumpulan modul yang dapat digunakan kembali untuk mengurangi biaya pemrograman di masa mendatang.

Dalam makalah ini kami menunjukkan bahwa dua fitur bahasa fungsional khususnya, fungsi tingkat tinggi dan evaluasi malas, dapat berkontribusi secara signifikan terhadap modularitas. Sebagai contoh, kami memanipulasi daftar dan pohon, memprogram beberapa algoritme numerik, dan mengimplementasikan heuristik alfa-beta (algoritme dari Artificial Intelligence yang digunakan dalam program bermain game). Kami menyimpulkan bahwa karena modularitas adalah kunci sukses pemrograman, pemrograman fungsional menawarkan keuntungan penting untuk pengembangan perangkat lunak.

Robert Harvey
sumber
10

Oleh karena itu, titik awal yang baik adalah mencoba memahami beberapa hal yang tidak mungkin dilakukan dalam bahasa imperatif tetapi mungkin dalam bahasa fungsional.

Jika Anda berbicara tentang komputabilitas, tentu saja tidak ada yang mungkin dalam pemrograman fungsional tetapi bukan pemrograman imperatif (atau sebaliknya).

Inti dari paradigma pemrograman yang berbeda bukanlah untuk membuat hal-hal menjadi mungkin yang sebelumnya tidak mungkin, itu untuk mempermudah hal-hal yang sebelumnya sulit.

Pemrograman fungsional bertujuan agar Anda lebih mudah menulis program yang ringkas, bebas bug, dan dapat diparalelkan.

sepp2k.dll
sumber
5

Tidak harus satu atau yang lain: menggunakan bahasa seperti C # 3.0 memungkinkan Anda untuk mencampur elemen terbaik dari masing-masing. OO dapat digunakan untuk struktur skala besar di tingkat kelas dan di atasnya, Gaya fungsional untuk struktur skala kecil di tingkat metode.

Menggunakan gaya Fungsional memungkinkan kode untuk ditulis yang menyatakan maksudnya dengan jelas, tanpa tercampur dengan pernyataan aliran kontrol, dll. Karena prinsip seperti pemrograman bebas efek samping, jauh lebih mudah untuk bernalar tentang kode, dan memeriksa kebenarannya .

Samuel Jack
sumber
5

Saya rasa contoh paling praktis dari kebutuhan untuk pemrograman fungsional adalah konkurensi - program fungsional secara alami aman untuk benang dan mengingat munculnya perangkat keras multi-inti, ini adalah yang paling penting.

Pemrograman fungsional juga meningkatkan modularitas - Anda sering dapat melihat metode / fungsi dalam imperatif yang terlalu panjang - Anda hampir tidak pernah melihat fungsi lebih dari beberapa baris. Dan karena semuanya telah dipisahkan - kegunaan kembali jauh lebih baik dan pengujian unit sangat mudah.

Bozhidar Batsov
sumber
3

Begitu program berkembang, jumlah perintah dalam kosakata kita menjadi terlalu tinggi, sehingga sangat sulit untuk digunakan. Di sinilah pemrograman berorientasi objek membuat hidup kita lebih mudah, karena memungkinkan kita untuk mengatur perintah kita dengan cara yang lebih baik. Kita dapat mengasosiasikan semua perintah yang melibatkan pelanggan dengan beberapa entitas pelanggan (kelas), yang membuat deskripsinya jauh lebih jelas. Namun, program ini masih berupa urutan perintah yang menentukan bagaimana program harus dilanjutkan.

Pemrograman fungsional menyediakan cara yang sangat berbeda untuk memperluas kosakata. Tidak terbatas pada menambahkan perintah primitif baru; kita juga dapat menambahkan struktur kontrol baru - primitif yang menentukan bagaimana kita dapat menempatkan perintah bersama untuk membuat program. Dalam bahasa imperatif, kami dapat membuat perintah dalam urutan atau menggunakan konstruksi bawaan dalam jumlah terbatas seperti loop, tetapi jika Anda melihat program tipikal, Anda masih akan melihat banyak struktur berulang; cara umum untuk menggabungkan perintah

Soner Gönül
sumber
1

Jangan memikirkan pemrograman fungsional dalam istilah "kebutuhan". Sebaliknya, anggap saja sebagai teknik pemrograman lain yang akan membuka pikiran Anda seperti OOP, template, bahasa assembly, dll mungkin telah sepenuhnya mengubah cara berpikir Anda ketika (jika) Anda mempelajarinya. Pada akhirnya, mempelajari pemrograman fungsional akan membuat Anda menjadi programmer yang lebih baik.

Justin Ethier
sumber
0

Jika Anda belum mengetahui pemrograman fungsional, maka mempelajarinya memberi Anda lebih banyak cara untuk memecahkan masalah.

FP adalah generalisasi sederhana yang mempromosikan fungsi ke nilai kelas pertama sedangkan OOP adalah untuk penataan kode skala besar. Namun, ada beberapa tumpang tindih, di mana pola desain OOP dapat direpresentasikan secara langsung dan jauh lebih ringkas menggunakan fungsi kelas satu.

Banyak bahasa menyediakan FP dan OOP, termasuk OCaml, C # 3.0 dan F #.

Selamat, Jon Harrop.

JD
sumber