Untuk masalah umum apa pemrograman fungsional tidak cocok? [Tutup]

22

Pemrograman fungsional adalah paradigma deklaratif. Salah satu kekuatan dengan FP adalah bahwa efek samping dihindari. Dikatakan bahwa untuk beberapa masalah, FP tidak cocok.

Untuk masalah umum apa yang tidak cocok untuk pemrograman fungsional?

Jonas
sumber
Wah! Sejenak di sana saya pikir Anda berkata "adalah paradigma yang rusak ". Kemudian saya kembali dan memeriksa.
Mark C
1
Saya pikir itu lebih akurat untuk mengatakan bahwa efek samping terisolasi (dalam Haskell toh) daripada dihindari. Monads memungkinkan untuk perubahan negara, dan satu bahkan dinamai "Negara".
Larry Coleman
Seperti yang dijelaskan Larry Coleman, tidak benar bahwa pemrograman fungsional menghindari efek samping, tetapi hal itu mengecilkan penggunaannya dan, dalam beberapa bahasa, itu jelas mengisolasi mereka. Baca mis. Bagian 7 dari research.microsoft.com/en-us/um/people/simonpj/papers/…
Giorgio

Jawaban:

17

Aplikasi yang sifatnya sangat stateful. Video game adalah contoh yang baik karena mereka memodelkan dunia nyata. Lebih masuk akal untuk berpikir tentang memodifikasi keadaan dunia alih-alih membangun kembali dari keadaan sebelumnya setiap kali ada perubahan.

Contoh konkret akan mengubah kesehatan monster setelah ditembak. Jauh lebih masuk akal untuk mengubah kesehatannya daripada menggantinya dengan monster yang sama sekali baru yang sama dalam segala hal kecuali sekarang kesehatannya kurang. Perubahan semacam ini menghasilkan hampir semua hal di dunia game, dan melakukan ini dengan cara fungsional murni tidak terlalu intuitif. Saya membayangkan mungkin ada beberapa hukuman kinerja yang signifikan, setidaknya jika Anda melakukannya dalam bahasa yang murni fungsional.

(Sebagai catatan, beberapa masalah dalam game sangat cocok untuk pemrograman fungsional, seperti AI. Bahasa hybrid fungsional / imperatif akan sangat cocok untuk kasus-kasus itu.)

Matt Olenik
sumber
9
Artikel Bahasa Pemrograman Mainstream Berikutnya: Perspektif Pengembang Game mengemukakan suatu pl, khususnya untuk pengembangan game, di mana perilaku yang murni fungsional adalah default, dan perubahan status dilacak melalui tipe, untuk menghindari bug. Jadi tidak semua orang percaya bahwa paradigma fungsional pada dasarnya tidak cocok untuk pemrograman game.
sepp2k
1
@ sepp2k, terima kasih atas tautannya. Saya senang melihat perspektif yang diperdebatkan dari seseorang yang membuat game nyata.
Matt Olenik
3
@ sepp2k tunggu, apakah saya melewatkan sesuatu? Setelah membaca presentasi lebih dekat, tampaknya Sweeney berargumen untuk sebagian besar mesin inti ditulis dengan kode fungsional murni, dan sebagian besar logika permainan ditulis secara imperatif (atau setidaknya memungkinkan) dan menggunakan STM untuk membantu dengan konkurensi . Ini tampaknya sangat masuk akal bagi saya.
Matt Olenik
@ Mat: Tidak, kamu benar, dia bilang bagian logika permainan akan berisi keadaan bisa berubah. Namun itu tidak menghalangi bahasa untuk melacak mutabilitas melalui tipe (yang ia usulkan di bagian "renungan"). Tentu saja "melacak status melalui tipe" tidak sama dengan "fungsional", jadi saya mungkin mengutarakan komentar saya sebelumnya terlalu optimis.
sepp2k
@ sepp2k benar, saya mengerti maksud Anda.
Matt Olenik
17

Pemrograman tertanam waktu nyata adalah semua tentang efek samping. Berinteraksi dengan io digital dan analog, timer, port serial dan paralel, semuanya menarik dilakukan dengan memanggil fungsi dengan efek samping.

ASHelly
sumber
3
Nah, jika Anda hanya bermaksud antarmuka perangkat keras saya ragu apa pun selain C / C ++ adalah pilihan yang baik. Namun pada lapisan di atas itu bahasa seperti Erlang kadang-kadang digunakan, khususnya dalam sistem telekomunikasi. Erlang adalah bahasa fungsional yang dirancang untuk sistem real-time tertanam kritis dan toleran-kesalahan.
Jonas
@Jonas: Erlang mungkin meminimalkan mutasi tetapi sangat bergantung pada IO untuk mengirimkan pesan yang, tentu saja, efek samping.
Jon Harrop
11

Saya berpendapat bahwa pemrograman GUI tidak cocok untuk pemrograman fungsional. GUI umumnya sangat stateful, dan jauh lebih mudah untuk memodelkan / mengelolanya menggunakan status daripada menggunakan efek samping gratis. Tentunya dimungkinkan untuk menggunakan bahasa pemrograman fungsional untuk GUI ... tapi mungkin itu bukan ide yang baik.

Seperti disebutkan dalam jawaban lain, gim seringkali lebih mudah dikelola dengan melacak keadaan, dan meskipun Anda dapat menulis gim dalam bahasa fungsional, gim seringkali lebih mudah dan lebih efisien untuk melakukannya dalam bahasa "keadaan" (yaitu, berorientasi objek bahasa).

mipadi
sumber
-1: Anda berbicara tentang kemurnian dan mengabaikan penggunaan fungsi kelas satu, misalnya panggilan balik dalam kode GUI jauh lebih mudah dengan bahasa FP yang tidak murni daripada dengan bahasa OOP.
Jon Harrop
4
@ Jon Harrop: Fungsi kelas satu tidak unik untuk bahasa pemrograman fungsional. Saya masih berpendapat bahwa gaya FP tidak cocok untuk GUI.
mipadi
1
Tergantung siapa yang kamu tanya. Bagi kebanyakan programmer fungsional, fungsi kelas satu adalah definisi pemrograman fungsional.
Jon Harrop
@ Jon Harrop: Sebagian besar programmer fungsional akan mengatakan bahwa pemrograman fungsional adalah metode menggambarkan program sebagai komposisi dan evaluasi fungsi matematika. Fungsi kelas satu adalah bagian penting dari paradigma ini, tetapi fungsi kelas satu saja bukan bahasa pemrograman fungsional (atau program fungsional). Paradigma pemrograman fungsional berupaya untuk meminimalkan penggunaan status dan struktur data yang bisa berubah, dan bahkan bahasa FP yang tidak murni mendorong gaya ini. FP adalah tentang gaya pemrograman seperti halnya fitur individual seperti fungsi kelas satu, dan ...
mipadi
... Saya tidak menemukan bahwa paradigma ini sangat cocok untuk pemrograman GUI - bahasa berorientasi objek lebih cocok untuk GUI, secara umum.
mipadi
5

Aplikasi bisnis berbasis data. Antarmuka pengguna dan operasi data sederhana tidak perlu FP.

Branimir
sumber
2
Dan aplikasi data / tampilan lainnya, sungguh. Sebagian besar gim adalah tentang keadaan dan mengubahnya, jadi jangan diterjemahkan dengan baik ke gaya fungsional.
Jon Purdy
18
Sangat? Saya selalu berpikir bahwa FP akan sangat baik untuk ini. Bukankah 99% dari apa yang dilakukan aplikasi memilih, mengagregasi, dan memproyeksikan data? Itu pada dasarnya filter, reducedan map. Lemparkan dalam beberapa sort, partition, groupBy. Bagaimanapun, bahasa pemrograman yang paling banyak digunakan untuk menulis aplikasi semacam itu adalah Excel, yang merupakan bahasa fungsional.
Jörg W Mittag
3
Aplikasi bisnis berbasis data dan aplikasi dengan operasi data sederhana kedengarannya sangat cocok untuk FP dan saya telah mendengar bahwa FP populer untuk hal-hal seperti itu. Misalnya, lihat programmer fungsionalitas Adventures fa di Wall Street
Jonas
1
-1: Anda telah membuat daftar beberapa aplikasi yang unggul di FP.
Jon Harrop
2

Anda tidak dapat dengan mudah mengabaikan masalah yang ditetapkan karena tidak cocok untuk pemrograman fungsional per se.

Banyak tergantung pada bahasa aktual yang digunakan untuk pemrograman fungsional dan fitur-fiturnya.

Salah satu contoh adalah Erlang yang telah disebutkan untuk embedded-system realtime.

Keutuhan negara juga bukan kriteria yang baik terhadap pemrograman fungsional, ada beberapa cara yang berhasil diterapkan dalam bahasa pemrograman fungsional untuk menangani hal ini.

Efek samping juga sering disebutkan terhadap pemrograman fungsional. Setiap program yang tidak sepenuhnya solipsistik memiliki efek samping. Jadi setiap bahasa FP dunia nyata memiliki beberapa cara untuk mengatasi hal ini, hanya masalah seberapa elegannya merangkum efek samping dunia.

Tidak perlu efek samping yang sewenang-wenang seperti variabel global sama sekali.

Tetapi ada set masalah yang membuatnya lebih mudah untuk masuk ke pemrograman fungsional karena mereka tidak memutar cara akrab Anda melihat masalah sebanyak itu. Tetapi begitu Anda berhasil berfikir fungsional semakin banyak set masalah terbuka untuk efek samping yang lebih sedikit.

Bahkan ketika memprogram C selalu merupakan ide yang bagus untuk mengurangi efek samping sewenang-wenang seperti variabel global sebanyak mungkin.

Peer Stritzinger
sumber
Aplikasi state-ful seperti aplikasi GUI sebenarnya sulit dilakukan secara fungsional, atau apakah Anda punya rekomendasi?
Jonas
Jika Anda memiliki semacam abstraksi proses / utas (mis. Seperti di Erlang), Anda dapat melewati kondisi Anda dalam suatu proses.
Peer Stritzinger
3
Aplikasi GUI biasanya dibangun di sekitar loop acara. Anda dapat menulis sebuah loop acara dengan cukup baik dalam bahasa fungsional. Jika lebih rumit, Anda mungkin akan menambahkan beberapa utas / proses untuk pemrosesan latar belakang. Tetapi jika Anda memiliki semacam abstraksi proses / utas (mis. Seperti di Erlang), Anda dapat melewati kondisi Anda dengan mudah. Lanjutan mungkin juga berguna. Saya pikir itu hanya membiasakan diri melakukan hal-hal dengan cara fungsional bahkan untuk mendapatkan pegangan pada GUI. Salah satu alasan pemrograman GUI dianggap sulit saat ini adalah karena sebagian besar toolkit tidak dimaksudkan untuk penggunaan fungsional.
Peer Stritzinger
1
@Jonas: di Haskell, Anda akan menggunakan IO monad, State monad, atau kombinasi.
Larry Coleman
1
@Jonas: itu tergantung pada definisi Anda tentang berguna. Contoh wikibook menggunakan wxHaskell, sementara Real World Haskell menggunakan gtk2hs. Saya belum mencoba karena aplikasi Haskell saya berbasiskan perintah.
Larry Coleman