2012-09-20 20 views
7

我正在教自己FRP和反應香蕉的過程,同時寫我希望對於那些跟隨我的人來說更有用的教程。你可以在教程here上查看我的進度。爲什麼沒有功能將活動建立在反應式香蕉的非事件之外?

我一直在嘗試使用事件來實現簡單的beepy噪聲示例。我知道我需要做這樣的事情:

reactimate $ fmap (uncurry playNote) myEvent 

在我NetworkDescription,但我無法弄清楚如何只是有網絡反覆做同樣的事情,或做一次。理想情況下,我在尋找這樣的事情:

once :: a -> Event t a 
repeatWithDelay :: Event t a -> Time -> Event t a 
concatWithDelay :: Event t a -> Event t a -> Time -> Event t a 

以上Time類型只是一個替身,我們最終使用任何的時間測量。我是否需要將系統時間作爲行爲來驅動「延遲」功能?這似乎比必要的更復雜。

由於提前,

回聲諾蘭

編輯:好的類型爲repeatWithDelay和concatWithDelay沒有任何意義。這是我的意思。

repeatWithDelay :: a -> Time -> Event t a 
concatWithDelay :: a -> a -> Time -> Event t a 
+0

如何使用計時器來生成事件? – AndrewC

回答

4

我選擇不包括在覈心模型這樣的功能,現在,因爲時間提出了一致性各種挑戰。例如,如果兩個事件計劃在現在5秒後發生,它們是否應該同時發生?如果不是,哪一個應該先到?我認爲核心模型應該適合形式化的證明,但這不適用於實際的物理時間測量。

也就是說,我計劃將這些功能包含在「他們工作但不保證」的時尚中。我還沒有這樣做的主要原因是有沒有時間測量的規範選擇。不同的應用程序有不同的需求,有時候你想要納秒分辨率,有時候你想使用GUI框架中的計時器,有時你想同步到外部的MIDI時鐘。換句話說,你希望基於時間的函數能夠與許多定時器實現一起工作,並且只有使用reactive-banana-0.7.0才能找到一個很好的API設計。

當然,已經有可能通過使用定時器來實現您自己的基於時間的功能。 Wave.hs示例演示瞭如何做到這一點。另一個例子是Henning Thielemann的reactive-balsa library,它實現了各種基於時間的組合器來實時處理MIDI數據。