我是新來的一般反應性香蕉和玻璃鋼,所以道歉,如果我失去了明顯的東西。執行zipE ::事件t a - >事件t b - >事件t(a,b)
對於my project(a GDB/MI前端)我對GUI和前端邏輯模塊都使用反應香蕉(版本0.6.0.0)。前者效果很好,但對於後者我顯然需要額外的組合器。其中之一是zipE :: Event t a -> Event t b -> Event t (a, b)
。不幸的是,我能想出是在使用changes
,而不是通用的事件類型NetworkDescription單子的解決方案:
zipE :: Event t Int -> Event t String -> NetworkDescription t (Event t (Int, String))
zipE ea eb = changes $ (,) <$> stepper 0 ea <*> stepper "" eb
當然,我並不滿足於此。因此我想問如何在不使用changes
(不鼓勵用於非GUI目的)的情況下實現通用的zipE函數。
其他嘗試失敗,例如
zipE :: Num a => Event t a -> Event t b -> Event t (a,b)
zipE ea eb = apply (stepper (0,) ((,) <$> ea)) eb
導致元組的第一元件由一個被移動 - 我想由於stepper
引入的「輕微的延遲」。但是我沒有看到如果沒有stepper
(或者accumB
就是這個問題),如何從一個事件中獲得行爲,我看不到如何將一個函數應用到沒有行爲的事件。總的來說,我不知道如何在泛型類型的情況下爲步進器提供初始值。
'ea'和'eb'不會同時開火。 (如果你知道他們會同時發射,因爲它們都來自同一個基礎事件,那麼重新處理這個基礎事件可能是最好的。)當一個人發生火災而另一個人發火時,你想要發生什麼? T' – dave4420 2012-07-31 14:44:06
戴夫,你是對的。我需要爲我的活動網絡設計不同的設計: - /謝謝您指出這一點。 – copton 2012-07-31 15:04:53
我確實需要一個不同的事件網絡。最初,我想壓縮兩個事件,將元組提供給'f ::(a,b) - > IO()'。我現在所擁有的是'f :: a - > b - > IO()'和'reachable $(步進器0 aE)<@> bE'。 – copton 2012-07-31 16:39:15