我正在使用reactive-banana程序工作,我想知道如何構建我的類型與基本的玻璃鋼基本構件。例如,下面是我的真實程序的一個簡化示例:假設我的系統主要由小部件組成 - 在我的程序中,隨時間變化的文本片段。在哪裏申請玻璃鋼行爲(和其他類型)
我能有
newtype Widget = Widget { widgetText :: Behavior String }
但我也可以有
newtype Widget = Widget { widgetText :: String }
,並使用Behavior Widget
時,我想談談隨時間變化的行爲。這似乎使事情「更簡單」,並且意味着我可以更直接地使用Behavior
操作,而不必解包和重新打包Widgets來執行操作。
另一方面,前者似乎避免了實際定義小部件的代碼中的重複,因爲幾乎所有小部件隨着時間的推移而變化,並且我發現自己定義了一些與Behavior
不同的部分,因爲它讓我以更一致的方式將他們與其他人結合起來。
作爲另一個例子,在兩種表示方式下,有一個Monoid
實例(我希望在我的程序中有一個實例)是合理的,但後者的實現看起來更自然(因爲它只是一個微不足道的提升將monoid列入新類型)。
(我的實際程序使用Discrete
而非Behavior
,但我不認爲這是相關的。)
同樣,我應該使用Behavior (Coord,Coord)
或(Behavior Coord, Behavior Coord)
代表一個2D點?在這種情況下,前者似乎是明顯的選擇;但是當它是代表遊戲中某個實體的五行記錄時,選擇似乎不那麼清晰。
在本質上,所有這些問題減少到:
當使用FRP,在哪一層,我應該使用Behavior
類型?
(同樣的問題也適用於Event
過,但在較小的程度。)
那麼,在'Widget'的情況下,只有一個字段不是簡化,這是我的實際情況,所以沒有元組參與:)感謝您的幫助 - 但它應該是對未來非常有幫助!現在我會把'行爲'放在newtype裏面。我希望我能接受這兩個答案:) – ehird 2011-12-24 13:36:53