2012-04-03 23 views
7

tüm tekrarlar da endişe üst üste birkaç kez tekrarlamak bazıları sayılar, bir dizi üreten bir olay akışına (I değilim var reaktif-muz Tekrarlanan etkinlikleri nasıl kaldırırım, sadece sıralı kopyalar). Bu etkinlik akışını yalnızca sıralı olmayan çoğaltmaları içerecek şekilde nasıl değiştirebilirim? Eğer reaktif-muz ise

Ben davranışı düşünerek bir davranışa dönüştürmek değişiklik kullanarak çalıştı olur ancak "değişim" olayı yeni bir numara oldu ama onun yerine davranış değişikliği olayı yeni bir giriş olay alındığında her zaman tetikler.

cevap

6

Not, bu olaylar ve davranışları ile düzenli programlama için kullanılmamalıdır. Yinelenen olay oluşumları baskıladığı

bir fonksiyon test Çalıştırma

skipEqual :: Eq a => Event t a -> Event t a 
skipEqual = filterJust . fst . mapAccum Nothing . fmap f 
    where 
    f y (Just x) = if x == y then (Nothing,Just x) else (Just y,Just y) 
    f y Nothing = (Just y, Just y) 

test = interpretModel skipEqual $ map (:[]) [1 :: Int,1,2,3,3,2] 

aşağıdaki gibi mapAccum ve filterJust bağdaştırıcılarla cinsinden ifade arzu edildiği gibi

*Main> test 
[[1],[],[2],[3],[],[2]] 

verir edilebilir.

Başka bir deyişle, olayların bir listesi olarak Event hayal edebilir ve daha sonra sevgili "liste" birleştiricilerini buna uygulayabilirsiniz.

+0

Ah, neden böyle düşünmedim ?! Çirkin uygulamayı cevabımdan çıkardım, bunun lehine. Değişiklikleri kullanmamalısınız eğer – ehird

+1

, nasıl bir davranış anlamlı bir şey yapacağım? – Orclev

+0

@Orclev: Davranışları olaylara uygulayabilirsiniz. Bunun için "<@>" ve "<@" operatörleri kullanılır. Ayrıca, davranışlar ve olaylar arasındaki karşılıklı özyinelemeyi kullanabilirsiniz. –

0

Eh, changes bir Behavior içine bir şey açılmıyor; sadece dış çerçeveler tutkal, böylece, NetworkDescription bir Behavior arasında değişiklikleri gözlemek sağlar. behaviour of changeschanges (stepper x e)return (calm e) olarak tanımlanmaktadır, yani stepper ve changes yoluyla bir etkinlik yuvarlak açma (sadece tüm eş zamanlı olaylar ama ilk atar) calm başka bir etkisi olacaktır.

Değeri değiştirmeyen olayları atmak için bir birleştiriciye sahip olmak yararlıdır ve diğer bazı FRP çerçevelerinin yerleşik olduğunu düşünüyorum. Ancak Heinrich'in yanıtının gösterdiği gibi kendi kolayca yazabilirsiniz. changes fonksiyon sadece GUI araç takımları ve vebenzerleriyle muamele edilmesi bağlanma için kullanılacak gerektiğini