7

我正在學習Haskell和Yampa,並且有關於反應函數的問題。Yampa中反應(有意義)函數的時間差異

reactimate :: IO a -- init 
     -> (Bool -> IO (DTime, Maybe a)) -- sense 
     -> (Bool -> b -> IO Bool) -- actuate 
      -> SF a b -- signal function 
     -> IO() 

正如你可以在類型簽名看,輸出爲傳感功能的一部分功能的當前和以前的通話之間的時間差。在我看到的例子中,這個時間差是在意義內部「手動」計算的,使用IORef來保持前一次調用的值。

看起來很奇怪,你必須跟蹤使用外部狀態的時間差,爲什麼這個計算在反應函數中完成? IORef是一種處理它的好方法嗎?

回答

1

我會認爲reactimate不計算時間增量本身的原因是,這將難以編碼一個具體的時間概念。假設您想要模擬10年期間的投資組合風險或類似的事情,並且您的時間增量分辨率應該是一天。這就是說,我同意Ioref的東西看起來有點古怪,儘管我在我的代碼中使用了相同的技術。