Kapan menggunakan bahasa pemrograman fungsional?

90

Dalam situasi apa saya harus memilih untuk menggunakan bahasa pemrograman fungsional daripada bahasa berorientasi objek yang lebih verbose seperti C ++, C # atau Java?

Saya mengerti apa itu pemrograman fungsional, yang tidak benar-benar saya mengerti adalah untuk jenis masalah apa apakah itu solusi yang tepat?

Alex Baranosky
sumber
Pertanyaan ini dijawab di sini stackoverflow.com/questions/381685/…
krosenvold
2
Selalu. Atau setidaknya tidak pernah.
Shelby Moore III
1
Dengan lambda, C # adalah fungsional garis batas.
JD

Jawaban:

50

Bahasa fungsional, menurut saya, bagus terutama untuk dua hal: Game AI dan perhitungan matematika. Ini bagus dalam game AI karena manipulasi daftar yang bagus (setidaknya di Lisp dan Skema), dan untuk perhitungan matematika karena sintaksnya. Skema, Lisp, dan Haskell memiliki sintaks yang membuat perhitungan matematika mudah dibaca. Hal terakhir yang harus saya tambahkan adalah bahwa bahasa fungsional adalah bahasa yang sangat menyenangkan. Kursus Skema saya adalah salah satu kursus yang paling saya sukai.

martiert
sumber
2
Setelah saya melupakan fakta bahwa otak saya ingin meledak di minggu pertama saya di kelas compiler yang saya ambil di Scheme, saya juga merasa itu sangat menyenangkan (dan saya menjadi jauh lebih baik dalam hal itu hehe)
Alex Baranosky
1
Bahasa fungsional apa yang telah Anda gunakan untuk perhitungan matematika?
Jules
8
Juga, penyusun! Saya pernah mendengar orang-orang yang telah menulis kompiler di Haskell mengatakan mereka "tidak akan pernah menulis kompiler dalam bahasa imperatif lagi".
ShreevatsaR
1
julesjacobs: Saya telah menggunakan sedikit haskell dan Scheme untuk menyelesaikan perhitungan matematika sederhana. Saya sama sekali tidak pandai dalam bahasa itu, jadi saya punya cara untuk menyelesaikan masalah yang lebih kompleks. Saya tidak bisa membuatnya cukup cepat sekarang.
martiert
95

Saya telah melakukan beberapa penelitian tentang ini sendiri dan berpikir saya dapat menambahkan CONCURRENCY ke daftar alasan untuk menggunakan bahasa fungsional. Lihat di beberapa titik dalam waktu dekat kecepatan prosesor tidak akan dapat meningkat menggunakan teknologi cpu yang sama. Fisika arsitektur tidak mengizinkannya.

Jadi di situlah pemrosesan bersamaan masuk.

Sayangnya sebagian besar bahasa OOP tidak dapat memanfaatkan beberapa prosesor sekaligus karena saling ketergantungan antar data.

Dalam bahasa pemrograman fungsional murni, komputer dapat menjalankan dua (atau lebih) fungsi sekaligus karena fungsi tersebut tidak mengubah informasi status luar.

Berikut adalah artikel bagus tentang pemrograman fungsional yang mungkin Anda sukai.

Alex Baranosky
sumber
38
Saya tidak akan mengatakan sebagian besar bahasa OO tidak dapat memanfaatkan sejumlah besar prosesor secara sewenang-wenang. Saya akan mengatakan bahwa agar program dapat memanfaatkan banyak prosesor pada saat yang sama dengan cara yang efisien dan andal, program itu harus diatur sedemikian rupa sehingga sebagian besar unit kode intensif komputasi berperilaku seperti fungsi murni. Anda dapat mengatur program dengan cara seperti itu di banyak bahasa. Ini lebih mudah dilakukan dalam bahasa fungsional daripada dalam bahasa imperatif (termasuk berorientasi objek).
Zak
2
Terima kasih telah menautkan artikel itu. Itu benar-benar membantu menjelaskan banyak hal untuk saya.
guptron
13

Seorang teman saya mengutip salah satu profesor kampusnya yang mengatakan sesuatu seperti berikut:

Gambar kisi dengan tipe data di bagian atas dan operasi pada tipe data tersebut di sisi kiri. Jika Anda mengiris grid secara vertikal, Anda melakukan OO; jika Anda mengiris grid secara horizontal, Anda melakukan FP.

Jawaban saya adalah bahwa FP adalah pendekatan yang benar-benar layak untuk pemrograman dengan berbagai aplikasi seperti OO. Seperti halnya diskusi pilihan bahasa pemrograman, saya pikir pertanyaan yang lebih penting adalah:

  1. Apakah Anda punya waktu untuk berinvestasi dalam mempelajari notasi baru dan cara berpikir baru?
  2. Manakah dari bahasa yang Anda pertimbangkan memiliki perpustakaan yang cukup kaya sehingga Anda tidak akan terjebak untuk menciptakan kembali beberapa roda?

Mengenai pertanyaan pertama, jika Anda melakukan ini terutama untuk nilai pembelajaran, saya sarankan untuk melihat Haskell , karena berbagai macam materi pendukung (buku, artikel, komunitas aktif, dll.)

Mengenai pertanyaan kedua, Haskell memiliki berbagai pustaka yang bagus (meskipun beberapa lebih matang daripada yang lain), tetapi Scala (bahasa fungsional-OO hibrida yang berjalan di JVM) memiliki kelebihan yaitu Anda dapat secara bertahap beralih ke gaya fungsional , dan Anda memiliki berbagai pustaka yang dapat diakses Java yang tersedia untuk Anda.

joel.neely
sumber
Saya belajar Skema di perguruan tinggi, jadi saya tidak ingin belajar pemrograman fungsional hanya untuk pengalaman. Saya lebih suka mempelajari beberapa bahasa fungsional untuk alasan praktis.
Alex Baranosky
9

Praktis semua yang bisa Anda lakukan di PP bisa dilakukan di FP, dan hal yang sama sebaliknya. Ini hanyalah cara lain untuk membuat kode sesuatu — perspektif lain tentang masalah dan cara berbeda untuk menyelesaikannya.

Namun, karena tidak banyak orang yang menggunakan FP, masalahnya lebih pada kurangnya perpustakaan yang baik, portabilitas / pemeliharaan (karena pengelola memiliki kesempatan lebih baik untuk memahami sesuatu yang ditulis dalam C ++ daripada Skema), dan kurangnya dokumentasi dan komunitas. Saya tahu ADA beberapa dokumen, namun, bandingkan dengan C ++, C # atau Java dan Anda akan mengerti maksud saya.

Namun, jika Anda benar-benar ingin melakukan FP, Anda dapat menggunakan gaya ini bahkan di C ++ dan C #. Tentu saja, ini tidak akan menjadi 100% FP jika Anda menggunakan pustaka standar. Sayangnya, menurut saya C # tidak dioptimalkan untuk digunakan dengan pemrograman fungsional dan mungkin akan menimbulkan banyak masalah kinerja.

Ini lebih merupakan posting subjektif, apa yang saya pikirkan tentang FP. Ini bukan deklarasi yang ketat.

pengguna35978
sumber
8
“Praktis semua yang bisa Anda lakukan di PP bisa dilakukan di FP” - Sebenarnya, itu persis segalanya.
BlueRaja - Danny Pflughoeft
2
@BlueRaja - apakah yang dimaksud dengan Kelengkapan Turing? Jika demikian, apa yang Anda katakan tidak mengikuti. Misalnya, Conway's Game of Life is Turing Complete, tetapi Anda tidak dapat menggunakannya untuk menulis driver kartu video seperti yang Anda bisa di C. Demikian juga, saya tidak melihat game terbaru apa pun yang ditulis di Haskell. Bisa dilakukan di FP! = Bisa secara teoritis dilakukan di FP teoritis.
Luigi Plinge
@Luigi Plinge Saya harus setuju dengan BlueRaja. Haskellers mendiskusikan beberapa driver Linux yang ditulis di Haskell. Saya tidak memiliki tautan tetapi saya juga mendengar OS telah ditulis di Haskell (mungkin bahasa fungsional lain juga). Sejauh permainan berjalan, saya tidak melihat permainan terbaru ditulis dalam C # atau Java, apakah Anda menyiratkan bahwa mereka tidak dapat digunakan untuk itu? Pokoknya, contoh game yang ditulis dalam FP. Juga, perlu diingat bahwa sebagian besar tautan saya adalah Haskell, bahasa fungsional yang MURNI.
austinprete
@PardonMyRhetoric Anda jelas dapat menulis game di Haskell dan melakukan komputasi apa pun, tetapi kecepatannya akan beberapa kali lebih lambat dan penggunaan memori lebih tinggi. Jadi contoh balasan dari pernyataan BlueRaja adalah bahwa Anda tidak dapat menulis "permainan yang secepat dan menggunakan banyak memori di C" di FP. Ini adalah masalah praktis yang nyata, bukan tipu muslihat (dan saya sama sekali tidak ingin menampar FP - saya sedang mengkode Scala sekarang!).
Luigi Plinge
1
@PardonMyRhetoric Ini juga perlu FP idiomatik. Tolok ukur yang Anda lihat yang memberikan kinerja Haskell mendekati C ditulis dalam gaya unidiomatik "tingkat rendah" yang tidak dapat ditulis oleh sebagian besar pemrogram Haskell. Misalnya, Anda dapat mencapai kinerja serupa hanya dengan membuat keluaran kode Haskell dan mengkompilasi kode C. Tidak ada gunanya. Masalah praktis terkait adalah tentang apa yang "bisa Anda lakukan" vs apa yang "bisa / bisa dilakukan". Jika sesuatu terlalu sulit, tidak terlalu menjadi masalah jika itu mungkin dalam teori (dan "mungkin" untuk siapa?).
Luigi Plinge
4

Bahasa fungsional bagus dalam banyak situasi. Itu tergantung pada pustaka bahasa fungsional tertentu.

Bagaimana Anda menjawab pertanyaan "Kapan menggunakan bahasa pemrograman berorientasi objek?"?

Jules
sumber
1
"Kapan menggunakan bahasa pemrograman berorientasi objek?" Ketika Anda ingin model komputasi apa pun, di sisi lain saya telah mencari masalah yang fp akan menjadi asnswer intuitif, saya masih mencari, itulah cara saya menemukan posting ini.
jimjim
@ Arjang saya kira pemrograman fungsional akan menemukan kegunaan yang luar biasa dalam aplikasi kalkulasi yang hanya membutuhkan input untuk menghasilkan output. Tidak ada mutabilitas dan tidak ada iterasi
EdgeDev
3

Meskipun ini adalah pertanyaan subjektif, saya hanya ingin menambahkan bahwa bahasa fungsional banyak digunakan untuk mengurai bahasa khusus domain ; sifat fungsional cocok untuk mengurai tata bahasa.

csl
sumber
2
Mengurai DSL? Saya pikir dengan makro Lisp dan sejenisnya, DSL diimplementasikan sebagai makro, bukan sesuatu yang akan diurai oleh program Lisp. YMMV dengan bahasa non-Lisp. :-P
Chris Jester-Young
1

Dari apa yang saya lihat, ini lebih merupakan masalah rasa daripada fungsionalitas (tidak ada permainan kata-kata). Sebenarnya tidak ada apa-apa tentang gaya bahasa yang membuatnya secara inheren lebih baik atau lebih buruk pada tugas-tugas tertentu.

TED
sumber
2
@JonHarrop - Mau menguraikan itu? Saya tidak menganggapnya begitu jelas, dan akan memalukan jika Anda meninggalkan kesan bahwa Anda memilih orang-orang dari meer boosterisim.
TED
1
Rumpun bahasa ML secara khusus dikembangbiakkan untuk metaprogramming dengan tambahan fitur bahasa yang canggih seperti pencocokan pola untuk memanipulasi pohon (misalnya pohon ekspresi). Akibatnya, rumpun bahasa ini secara inheren jauh lebih baik dalam tugas khusus itu.
JD
1
@JonHarrop - Saya akan menerimanya. Namun, Anda berbicara tentang ML, bukan bahasa fungsional secara umum. Saya sangat percaya pada DSL jadi saya certianly tidak akan membantah penggunaan bahasa tertentu untuk tugas yang tepat yang dirancang untuk itu.
TED
Saat ini, pencocokan pola ditemukan di hampir semua bahasa fungsional termasuk OCaml, F #, Scala, Haskell, Clojure dan Erlang. Misalnya, saya baru-baru ini membuat mesin aturan bisnis yang dipesan lebih dahulu untuk klien dengan fokus pada matematika. Itu adalah 1.000 baris F # dan sebagian besar merupakan penerjemah. Lexing, parsing, pengecekan tipe dan input interpreting semuanya jauh lebih mudah berkat pencocokan pola.
JD
@JonHarrop ..tapi tidak semua. Ini bukan fitur inheren dari bahasa fungsional, itulah yang ditanyakan oleh pertanyaan itu.
TED
1

Secara umum, gunakan bahasa yang paling mudah digunakan untuk mengungkapkan solusi suatu masalah. Untuk pemrograman fungsional, ini adalah saat solusi untuk suatu masalah dengan mudah diekspresikan dalam bentuk fungsi , maka namanya. Umumnya bagus untuk operasi matematika, AI, pencocokan pola; secara umum segala sesuatu yang dapat dipecah menjadi seperangkat aturan yang harus diterapkan untuk mendapatkan jawaban. Anda hanya dapat benar-benar menentukan bahasa "terbaik" untuk digunakan setelah Anda cukup menganalisis masalah Anda. Di sinilah pseudo-code berguna. Jika Anda menemukan diri Anda menulis pseudo-code yang terlihat seperti FP, gunakan FP.

Tentu saja, semua bahasa pemrograman lengkap secara fungsional setara, jadi tidak masalah yang mana yang Anda pilih dalam hal masalah apa yang dapat Anda selesaikan. Efek utamanya adalah dalam hal efisiensi dan akurasi pengkodean, dan kemudahan pemeliharaan.

Perhatikan juga bahwa dimungkinkan untuk meniru FP dalam bahasa OO melalui API yang dirancang dengan cerdik. Misalnya, saya telah melihat banyak perpustakaan Java (JMock adalah salah satu contoh) yang menggunakan rangkaian metode untuk mensimulasikan FP DSL. Kemudian Anda akan melihat konstruksi seperti:

logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );

Ini pada dasarnya membangun fungsi yang dievaluasi untuk menentukan apakah beberapa urutan panggilan pada objek tiruan sudah benar. (contoh dicuri dari http://www.jmock.org/yoga.html )

Sintaks mirip FP lainnya dalam bahasa OO lainnya adalah penggunaan closure, seperti di Ruby.

Phil
sumber
2
"... tidak masalah yang mana yang kamu pilih dalam hal masalah apa yang bisa kamu selesaikan". Hanya jika Anda memiliki waktu dan uang yang tidak terbatas untuk menyelesaikan masalah Anda.
JD