Setelah membaca banyak halaman tentang FRP saya akhirnya menemukan ini tulisan tentang FRP yang mencerahkan , akhirnya membuat saya mengerti apa sebenarnya FRP itu.
Saya kutip di bawah ini Heinrich Apfelmus (penulis pisang reaktif).
Apa inti dari pemrograman reaktif fungsional?
Jawaban umum adalah bahwa "FRP adalah semua tentang menggambarkan suatu sistem dalam hal fungsi yang bervariasi waktu daripada keadaan yang bisa berubah", dan itu tentu saja tidak salah. Ini adalah sudut pandang semantik. Tetapi menurut saya, jawaban yang lebih dalam, lebih memuaskan diberikan oleh kriteria sintaksis murni berikut:
Inti dari pemrograman reaktif fungsional adalah untuk menentukan perilaku dinamis dari suatu nilai sepenuhnya pada saat deklarasi.
Misalnya, ambil contoh penghitung: Anda memiliki dua tombol berlabel "Atas" dan "Turun" yang dapat digunakan untuk menambah atau mengurangi penghitung. Secara imperatif, Anda pertama-tama akan menentukan nilai awal dan kemudian mengubahnya setiap kali tombol ditekan; sesuatu seperti ini:
counter := 0 -- initial value
on buttonUp = (counter := counter + 1) -- change it later
on buttonDown = (counter := counter - 1)
Intinya adalah bahwa pada saat deklarasi, hanya nilai awal untuk penghitung yang ditentukan; perilaku dinamis penghitung tersirat dalam sisa teks program. Sebaliknya, pemrograman reaktif fungsional menentukan seluruh perilaku dinamis pada saat deklarasi, seperti ini:
counter :: Behavior Int
counter = accumulate ($) 0
(fmap (+1) eventUp
`union` fmap (subtract 1) eventDown)
Setiap kali Anda ingin memahami dinamika penghitung, Anda hanya perlu melihat definisinya. Segala sesuatu yang dapat terjadi padanya akan muncul di sisi kanan. Ini sangat kontras dengan pendekatan imperatif di mana deklarasi selanjutnya dapat mengubah perilaku dinamis dari nilai yang dinyatakan sebelumnya.
Jadi, dalam pemahaman saya, program FRP adalah seperangkat persamaan:
j
diskrit: 1,2,3,4 ...
f
tergantung pada t
sehingga ini menggabungkan kemungkinan untuk memodelkan rangsangan eksternal
semua status program diringkas dalam variabel x_i
Perpustakaan FRP menangani kemajuan waktu, dengan kata lain, mengambil j
ke j+1
.
Saya menjelaskan persamaan ini secara lebih rinci dalam video ini .
EDIT:
Sekitar 2 tahun setelah jawaban asli, baru-baru ini saya sampai pada kesimpulan bahwa implementasi FRP memiliki aspek penting lainnya. Mereka perlu (dan biasanya melakukan) memecahkan masalah praktis yang penting: pembatalan cache .
Persamaan untuk x_i
-s menggambarkan grafik ketergantungan. Ketika beberapa x_i
perubahan pada saat itu j
maka tidak semua nilai lain x_i'
di j+1
perlu diperbarui, jadi tidak semua dependensi perlu dihitung ulang karena beberapa x_i'
mungkin independen dari x_i
.
Selanjutnya, x_i
-s yang melakukan perubahan dapat diperbarui secara bertahap. Sebagai contoh mari mempertimbangkan operasi peta f=g.map(_+1)
di Scala, di mana f
dan g
adalah List
dari Ints
. Berikut f
sesuai dengan x_i(t_j)
dan g
adalah x_j(t_j)
. Sekarang jika saya menambahkan sebuah elemen ke g
kemudian akan sia-sia untuk melakukan map
operasi untuk semua elemen di g
. Beberapa implementasi FRP (misalnya reflex-frp ) bertujuan untuk menyelesaikan masalah ini. Masalah ini juga dikenal sebagai komputasi inkremental.
Dengan kata lain, perilaku (the x_i
-s) di FRP dapat dianggap sebagai perhitungan cache-ed. Adalah tugas mesin FRP untuk secara efisien membatalkan dan mengkomputasi ulang cache-s ini (the x_i
-s) jika beberapa f_i
-s memang berubah.