Adakah yang punya model mental atau metafora yang bagus untuk pemrograman fungsional yang merujuk sesuatu di dunia nyata?
Pemrograman Berorientasi Objek secara intuitif masuk akal bagi saya. Ada hal-hal yang memiliki properti dan kadang-kadang mereka juga dapat melakukan hal-hal atau melakukan perhitungan pada properti mereka (metode). (Mis: Mobil, Bentuk, Kucing).
Saya menanggung pemrograman fungsional tidak ada niat buruk sama sekali dan saya tidak tertarik dalam perdebatan tentang kebaikan keduanya. Saya hanya perlu metafora atau model mental untuk bekerja seperti yang saya miliki dengan pemrograman Berorientasi Objek.
Apa saja model mental yang baik atau metafora dunia nyata untuk pemrograman dalam paradigma fungsional? Ada sesuatu tentang fungsi-fungsi yang terdiri dari fungsi-fungsi pemrosesan fungsi yang membuat seseorang tanpa tempat yang kuat untuk berdiri dan berpikir.
sumber
Jawaban:
Pemrograman fungsional adalah semua tentang menempelkan fungsi yang lebih kecil bersama untuk mencapai hasil Anda. Model mental yang layak (bagi saya, setidaknya) adalah jalur perakitan. Setiap fungsi yang dikomposisikan adalah satu langkah lagi dalam proses perakitan. Pertimbangkan fungsi ini di sini:
Di Haskell, fungsi ini akan mengembalikan elemen terkecil dalam daftar. Baris perakitan pertama mengurutkan input, lalu mengembalikan elemen pertama (dengan asumsi itu diurutkan paling sedikit ke terbesar.) Jika kita hanya ingin mendapatkan nilai genap terkecil, maka kita dapat mengubah jalur perakitan agar terlihat seperti berikut:
Hanya satu langkah lagi di ban berjalan.
Singkatnya, fungsi hanya menggambarkan langkah-langkah yang diambil untuk mengubah input mentah (bagian-bagian) menjadi barang yang diproses (output.)
sumber
(f . g) (x)
artinyaf(g(x))
atauf . g
sarana\x -> f (g (x))
..
didefinisikan; ini bukan cara Haskell bekerja secara umum . Anda bisa juga mendefinisikan operator pipa maju F #|>
di Haskell dan menulissmallest x = (sort x) |> head
dan data akan mengalir dengan benar. Kupikir aku akan menunjukkannya.Matematika. Pemrograman fungsional terinspirasi oleh dan dimodelkan pada matematika. Fungsi matematika tidak memiliki status, tidak memiliki efek samping, dll, dan begitu pula dengan FP. Jika Anda berpikir tentang FP dalam hal fungsi matematika daripada menggunakan gaya OO "bagaimana saya melakukan ini untuk itu" pendekatan, Anda akan berada dalam kondisi yang baik. Jika Anda mencoba membawa kepekaan OO ke FP, Anda akan berenang melawan arus.
sumber
Bagaimana dengan buku flip ?
Dalam buku flip, setiap halaman mewakili dunia sebagaimana adanya pada saat tertentu. Dalam program kami, dunia direpresentasikan sebagai beberapa struktur data majemuk (mis. Kami memiliki pisang yang ada di tangan gorila yang ada di pohon yang ada di hutan). Setiap halaman berikutnya memajukan cerita dengan sedikit memodifikasi representasi sebelumnya. Dalam FP, struktur data persisten dirancang untuk menggunakan kembali struktur sebelumnya secara efisien sehingga perubahan hanya menyediakan delta dan bukan rendisi yang sepenuhnya baru.
Apa yang mungkin tidak jelas adalah bahwa sebuah halaman di buku flip kami juga akan mewakili hal yang tidak berwujud. Misalnya, jika gorila menjatuhkan pisang, kita mungkin mulai menerapkan efek gravitasi pada kelaikan dan akselerasi menuju lantai hutan. Untuk mengakomodasi ini, kami akan melampirkan atribut seperti kecepatan dan lintasan ke pisang kami.
Dalam program kami akan ada fungsi yang menerima halaman buku flip (alias negara dunia) sebagai argumen dan menghasilkan halaman baru . Dengan cara ini, kisah kita diceritakan tanpa pernah benar-benar mengubah keadaan objek yang ada. Kami hanya mengganti setiap halaman dengan yang lebih baru menggunakan apa yang secara efektif merupakan perhitungan.
sumber
Hubungan.
Teman: Diberi dua orang, hubungan pertemanan mengikuti hukum umum ini
Monoid: Diberikan beberapa item dan fungsi yang mengambil 2 item dan mengembalikan 1, hubungan monoid mengikuti hukum umum ini
Pemrograman fungsional adalah semua tentang generalisasi, teman adalah hubungan yang sangat umum yang dapat dilihat dalam banyak skenario, tetapi dalam semua berbagai format umumnya mengikuti undang-undang di atas.
Menyadari undang-undang yang mengatur hubungan antara berbagai hal, Anda dapat membuat implementasi umum yang bekerja pada segala format hal yang memiliki jenis hubungan tersebut. Dalam pemrograman fungsional Anda mencoba mengidentifikasi hubungan antara hal-hal sehingga mereka dapat diklasifikasikan dan diperlakukan secara umum.
Anda ingin metafora dari dunia nyata? Lihatlah bagaimana berbagai hal terkait dan cobalah untuk mengidentifikasi hukum umum (seperti yang berlaku untuk beberapa skenario di mana hal-hal selain hukum mungkin berbeda). Ada hubungan antara petugas registrasi dan pembelanja di toko, ia memiliki beberapa hukum umum, perangkat lunak telah dikembangkan untuk memfasilitasi tujuan orang-orang dalam hubungan umum di jalan sistem POS. Demikian pula ketika Anda mulai melihat undang-undang umum ini menentukan bagaimana hal-hal terkait, Anda dapat mulai mengandalkan undang-undang hubungan tersebut dalam menulis perangkat lunak Anda dan bukan pada hal-hal khusus dari contoh hubungan.
sumber
Semuanya adalah nilai, dan Anda menerapkan fungsi ke nilai (yang mungkin fungsi) untuk menghasilkan nilai baru, lebih disukai tanpa menghasilkan efek samping.
sumber
Hal utama yang harus disadari tentang pemrograman fungsional adalah bahwa semuanya adalah nilai - bahkan kode itu sendiri adalah 'nilai'.
Contoh terbaik dari lingkungan pemrograman fungsional yang sederhana adalah alat bisnis favorit semua orang - spreadsheet. Setiap sel dalam spreadsheet adalah data, atau hasil dari suatu fungsi. Terlebih lagi, fungsi ini tidak dapat mematikan dan memodifikasi sel lain.
Ketika salah satu bergerak ke bahasa fungsional, bukannya jaringan Cartesian dari
A1
danB42
, fungsi memiliki nama. Hanya itu yang sebenarnya.Ada aspek-aspek lain yang bisa ditambahkan seseorang di luar ini ... tapi itu pemrograman fungsional pada intinya. Orang tidak perlu khawatir tentang struktur daftar atau pengelompokan hal-hal. Pemrograman fungsional adalah tentang meneruskan nilai ke dalam suatu fungsi dan mendapatkan nilai kembali tanpa mucking di tempat lain dalam memori.
Itu dia. Pemrograman fungsional adalah spreadsheet dengan nama daripada kisi.
sumber
Anda dapat menganggap pemrograman fungsional sebagai perilaku . Program adalah deskripsi perilaku yang Anda inginkan dari komputer. Fungsi adalah unit dasar perilaku, dan komposisi fungsi adalah salah satu cara untuk membangun perilaku yang lebih besar dari yang lebih kecil.
Dalam OOP, objek kode dimaksudkan sebagai keadaan objek dalam domain masalah; itu berubah seiring waktu untuk mencerminkan perubahan pada objek domain itu. Dalam FP, nilai mewakili keadaan objek domain; tidak pernah berubah, Anda cukup membuat nilai yang berbeda untuk mewakili negara yang berbeda.
Saya menemukan model fungsional sedikit lebih jujur tentang apa yang sebenarnya dilakukan komputer — mewakili. Lagi pula, saya tidak bisa begitu saja menyulap
new Tesla()
kehabisan udara. :)sumber
Kalimat lebih fungsional daripada berorientasi objek, dengan asumsi Anda memecahnya lebih atau kurang seperti berikut ini ...
Jadi kita perlu menemukan frasa kepala dan sisanya:
Dalam satu pergi:
Pohon Parse:
Parsimony menginfeksi pemikiran fungsional;
Angkat topi ke Gottlieb Frege 1890-an, Alan Turing (entschiedungsprobleme) 1930-an, Noam Chomsky (1960-an).
sumber