2011-12-07 24 views
7

我正在寫一個流轉換器從一些輸入數據類型到一個輸出數據類型。輸入是由用戶進行的,所以事件之間有一段時間。因爲每個輸入都需要一些資源加載,所以我想「展望未來」,即將所有可能的輸入發送到主計算並根據結果預加載資源。是否有可以像自動機一樣使用的monads?

目前,每次輸入後總是隻有一個輸出,但最終可能會變得有趣。

我成功地用Ross Paterson的Automaton變壓器來實現它。我不確定我的解決方案是否最佳。

  • 有沒有很好的例子如何做到這一點?甚至可能使用測試代碼?
  • 它也可以用monad來實現嗎? (Examples ?, Explanation why why is impossible?)

編輯: 在更多細節的調用之後,我在這裏添加了代碼。現在我刪除它(這是不可理解的)並添加一些其他解釋。我的問題回答了。

我的意圖是讓主事件循環在每個用戶輸入已經被饋送到箭頭/流轉換器/任何東西之後停止。然後它會存儲當前的自動機狀態,並將所有可能的輸入(假事件)逐個發送給自動機,並查看必須加載哪些資源以緩存它們。在下一個真實事件之後,它會使用緩存來提高響應速度。主要計算不應受此影響。

+0

沒有資格回答,但迭代可能對您有用。看到這個庫:http://hackage.haskell.org/package/enumerator ...但箭頭似乎是一個很好的抽象。我敢打賭,更多細節會幫助人們回答。 – jberryman

+0

+1更具體。 – sclv

回答

8

您提到的所有用例都包含在Netwire庫中。它提供了一個羅斯自動機箭頭概括家庭箭頭。我還沒有完成wiki page,但它應該給你足夠的啓動。

Kleisli (LogicT m)Kleisli (LogicT m)組合在一起可以得到不確定的電線。

作爲一個附加說明:你想要的不是一個單子。

+1

Hallo Ertes! 你能解釋爲什麼這不是單子嗎? – Duschvorhang

+0

@Duschvorhang:箭是monads的推廣。請參見[Haskell wiki> arrow](http://haskell.org/haskellwiki/Arrow) –

+0

@Duschvorhang:您可以在約翰休斯的[將單元向箭頭推廣]的§3.0的解析器示例中看到類似的限制(http: //www.ittc.ku.edu/Projects/SLDG/filing_cabinet/Hughes_Generalizing_Monads_to_Arrows.pdf)以及箭頭如何提供所需表達的細節解釋。除此之外,這是一個很好的閱讀。 – acfoltzer

相關問題