2012-12-17 18 views
19

Bana öyle geliyor ki, iki fikir arasında güçlü bir bağlantı var. Benim tahminim, Iterate'ler ile keyfi grafikler ifade etmenin bir yolu olsaydı, FRP'nin Yineleyiciler açısından uygulanabileceğidir. Fakat afaik sadece zincir benzeri yapıları destekliyorlar.Yineleme ve FRP arasındaki bağlantı nedir?

Birisi buna ışık tutabilir mi?

cevap

13

Bu başka bir yoldur. AFRP ve akış işleme arasında güçlü bir bağlantı var. Aslında AFRP akışı işleme şeklidir ve boruları çok benzer bir şekilde uygulamak için deyim kullanabilirsiniz:

Netwire bulunduğu haliyle tel kategorilerinin bir uzantısı
data Pipe m a b = 
    Pipe { 
     cleanup :: m(), 
     feed :: [a] -> m (Maybe [b], Pipe m a b) 
    } 

. Bir sonraki girdi yığınını alır ve üretmeyi durdurduğunda hiçbir şey döndürmez.

fmap (B.map toUpper) . readFile 
: Sadece fmap kullanmak böylece akışı elemanlarına basit bir işlevi uygulamak için,

readFile :: (MonadIO m) => FilePath -> Pipe m a ByteString 

Boru uygulamalı functors ailesidir: Bu dosya okuyucu kullanma aşağıdaki türü olurdu

Size kolaylık sağlamak için aynı zamanda bir profesör ailesi.

En ilginç özellik, bu, bir Alternative functor ailesidir. Bu, akışları yönlendirmenize ve birden çok akış işlemcisinin pes etmeden önce "denemesine" olanak tanır. Bu, optimizasyon amacıyla bazı statik bilgileri bile kullanabilen tam teşekküllü bir ayrıştırma kütüphanesine genişletilebilir.

+0

Ah, Benzer bir şey göndermek üzereydim, ama aslında bir AFRP kütüphanesi yazan birinin uzmanlığını erteleyeceğim. :] –

+0

(A) FRP kullanmanın bir asiklik grafik yapısıyla sınırlı olmayacağı anlaşılıyor, bu doğru mu? – fho

+3

Yanıtlarınızdan AFRP'nin herhangi bir yönü terimlerle veya kütüphaneler borusu/borularına sahip olan son akışla uygulanamazsa ne olur? – Davorak

13

Akış işlemcileri kullanarak sınırlı bir FRP formu uygulayabilirsiniz. Örneğin, pipes kütüphaneyi kullanarak, olayların bir kaynak tanımlayabilirsiniz:

mouseCoordinates :: (Proxy p) =>() -> Producer p MouseCoord IO r 

... ve benzer fare koordinatlarını alır ve bir tuval üzerinde bir imleç günceller bir grafik işleyicisi tanımlayabilirsiniz:

coordHandler :: (Proxy p) =>() -> Consumer p MouseCoord IO r 

>>> runProxy $ mouseCoordinates >-> coordHandler 

Ve beklediğiniz sadece yol aday olacağını:

Sonra kompozisyon kullanılarak işleyicisi için fare olayları kanca olacaktır.

Dediğiniz gibi, bu, tek bir aşamalar zinciri için iyi çalışır, ancak daha fazla rastgele topolojiler ne olur? Eh, Proxy tip pipes tipinin bir monad trafosu olduğu için, proxy monad transformatörlerini kendi başlarına yerleştirerek herhangi bir rastgele topolojiyi modelleyebilirsiniz.

zipD 
:: (Monad m, Proxy p1, Proxy p2, Proxy p3) 
=>() -> Consumer p1 a (Consumer p2 b (Producer p3 (a, b) m)) r 
zipD() = runIdentityP $ hoist (runIdentityP . hoist runIdentityP) $ forever $ do 
    a <- request()    -- Request from the outer Consumer 
    b <- lift $ request()  -- Request from the inner consumer 
    lift $ lift $ respond (a, b) -- Respond to the Producer 

Bu curried fonksiyonu gibi davranır: Örneğin, burada iki giriş akışları zip şekli şöyledir. Bunu her bir girişe kısmen uygularsınız ve tam olarak uygulandığında çalıştırabilirsiniz.

>>> p3 
(1, 4) 
(2, 5) 
(3, 6) 

Bu numara herhangi topoloji ile genelleştirildiğinde:

-- 1st application 
p1 = runProxyK $ zipD <-< fromListS [1..] 

-- 2nd application 
p2 = runProxyK $ p2  <-< fromListS [4..6] 

-- 3rd application 
p3 = runProxy $ printD <-< p3 

Bekleyebileceğiniz sadece yol çalıştırır.Bununla ilgili daha fazla bilgiyi Control.Proxy.Tutorial "Şubeler, fermuarlar ve birleştirmeler" bölümünde bulabilirsiniz. Özellikle, bir örneği kullandığı fork birleştiriciyi, bir akışı iki çıkışa bölebilirsiniz.

+0

Bu tamamen aklı başında olan yinelemeli kütüphanelerin doğru olduğuna eminim. Oleg bir süre önce kullandı. Kimsenin neden mümkün olduğunu hatırlamadığından emin değilim; teknik çok faydalıdır. –

+0

@JohnL Bu yüzden bunu vaaz etmeniz gerekiyor! Herkes Oleg'in ne yaptığını bilmiyor. –

+0

Oleg'in ne yaptığını bilen insanlar bile bunu anlamıyorlar. Ne yazık ki bu grupta sık sık yaşıyorum, en azından önce ... –

İlgili konular