FRP hakkında birçok sayfa okuduktan sonra nihayet FRP hakkındaki bu aydınlatıcı yazı ile karşılaştım, sonunda FRP'nin gerçekte ne olduğunu anlamamı sağladı.
Heinrich Apfelmus'un (reaktif muz yazarı) aşağıda alıntı yapıyorum.
Fonksiyonel reaktif programlamanın özü nedir?
Yaygın bir cevap, “FRP tamamen bir sistemi değişebilir durum yerine zamanla değişen işlevler açısından tanımlamakla ilgilidir” ve bu kesinlikle yanlış olmaz. Anlamsal bakış açısı budur. Ancak bence, daha derin, daha tatmin edici bir cevap aşağıdaki tamamen sözdizimsel ölçüt tarafından verilir:
Fonksiyonel reaktif programlamanın özü, bir değerin dinamik davranışını beyan anında tamamen belirtmektir.
Örneğin, bir sayaç örneği alın: sayacı artırmak veya azaltmak için kullanılabilen “Yukarı” ve “Aşağı” etiketli iki düğmeniz var. Zorunlu olarak, önce bir başlangıç değeri belirtir ve ardından bir düğmeye her basıldığında bunu değiştirirsiniz; böyle bir şey:
counter := 0 -- initial value
on buttonUp = (counter := counter + 1) -- change it later
on buttonDown = (counter := counter - 1)
Mesele şu ki, beyan sırasında sadece sayaç için başlangıç değeri belirtilir; sayacın dinamik davranışı program metninin geri kalanında gizlidir. Buna karşılık, fonksiyonel reaktif programlama, bildirim sırasındaki tüm dinamik davranışı şu şekilde belirtir:
counter :: Behavior Int
counter = accumulate ($) 0
(fmap (+1) eventUp
`union` fmap (subtract 1) eventDown)
Sayacın dinamiklerini anlamak istediğinizde, sadece tanımına bakmanız gerekir. Olabilecek her şey sağ tarafta görünecektir. Bu, sonraki bildirimlerin daha önce bildirilen değerlerin dinamik davranışını değiştirebileceği zorunlu yaklaşımın aksine.
Yani, içinde benim anlayış bir FRP programı denklemlerin bir dizi:
j
ayrık: 1,2,3,4 ...
f
bağlıdır t
bu dış uyaranları modellemek için possiblilty birleştirir böylece
programın tüm durumu değişkenlerle kapsüllenir x_i
CTP kütüphane alarak başka bir deyişle, zaman ilerliyor ilgilenir j
için j+1
.
Bu videoda bu denklemleri çok daha ayrıntılı olarak açıklıyorum .
DÜZENLE:
Orijinal yanıttan yaklaşık 2 yıl sonra, son zamanlarda FRP uygulamalarının başka bir önemli yönü olduğu sonucuna vardım. Önemli bir pratik sorunu çözmeleri (ve genellikle çözmeleri) gerekir: önbellek geçersiz kılma .
x_i
-S denklemleri bir bağımlılık grafiğini tanımlar. Zamandaki x_i
değişikliklerin bazılarının j
o zaman tüm diğer x_i'
değerlerin j+1
güncellenmesi gerekmediği için, tüm bağımlılıkların yeniden hesaplanması gerekmez, çünkü bazıları x_i'
bağımsız olabilir x_i
.
Ayrıca, x_i
değişiklik yapan -s kademeli olarak güncellenebilir. Örneğin en harita çalışmasını düşünün izin f=g.map(_+1)
Scala, içinde f
ve g
vardır List
içinde Ints
. Burada f
karşılık gelir x_i(t_j)
ve g
öyle x_j(t_j)
. Şimdi bir elementi başarabilirsem, g
oradaki map
tüm elementler için operasyonu yürütmek israf olacaktır g
. Bazı FRP uygulamaları (örneğin reflex-frp ) bu sorunu çözmeyi amaçlamaktadır. Bu sorun, artımlı hesaplama olarak da bilinir .
Başka bir deyişle, FRP'deki davranışlar ( x_i
-s) önbelleğe alınmış hesaplamalar olarak düşünülebilir. x_i
Bazı f_i
-s'ların değişmesi durumunda bu önbellekleri ( -s) etkili bir şekilde geçersiz kılmak ve yeniden hesaplamak FRP motorunun görevidir .