2011-07-22 19 views
17

在Haskell中,Iteratee based I/O看起來很有吸引力。迭代器是一種可組合的,安全的,快速的I/O方式,受到函數式語言中'fold'a.k.a.'reduce'函數的啓發。 基本上,如果你有遍歷,這個想法是把遍歷狀態封裝到一個所謂的「枚舉器」中,他調用了「迭代器」,它又是一個函數,它返回一個值或者一個請求以獲得更多的數據以及一個延續供調查員致電。因此只有枚舉器知道遍歷的狀態,而迭代器知道如何處理數據並從中創建值。關於它的好處是迭代器可以自動組合,其中一個迭代器的輸出被饋送到另一個迭代器以產生更大的迭代器。在非函數式語言中迭代I/O是否有意義?

於是,兩個問題:

  • 請問概念甚至讓SENCE在其他語言,如純面向對象的語言呢,還是克服Haskell的懶惰我的缺點有用/ O?
  • 是否有其他語言的實際實現,特別是C#(因爲這是我公司使用的)? (谷歌搜索在Scala中提到了一次迭代;當然,我現在對Scala沒有興趣)。
+0

這不是基本上C#5.0中的新異步內容是爲什麼設計的嗎?機制是不同的,但底層實現基本上是一個延續傳遞的實現。 –

+0

感謝您指出 - 我還不知道這件事,它看起來令人興奮,所以我必須研究它,儘管我看不到它與iteratees有很多共同之處。 ;-) – firefrorefiddle

回答

8
+0

從我乍一看,我認爲你是對的!謝謝,我會研究他們。 – firefrorefiddle

+0

我還沒有完成實施。它顯示了基本的結構。 https://gist.github.com/4025522。有一個區別Observer不能發送消息給observable(只能通過IDisposable取消訂閱),但iteratee可以向枚舉器發送消息。 –

8

首先,認識到Haskell的「懶惰IO」是一種破壞純度的破解,以有限的方式破壞純度,以便隨着數據的消耗懶散地允許I/O按需發生。在不純的語言中這是照常營業的,懶惰的序列可以在任何地方產生相同的問題。所以如果你正在做一些類似於將一個IEnumerable接口暴露給一個文件並且隨着序列被枚舉而逐漸讀取它,這實際上並沒有什麼不同。其次,迭代和枚舉也可以組成所謂的(以某種笨拙的方式)枚舉。在這一點上,你有一些東西被饋入順序數據,當它們準備好時產生增量結果,並將這些結果提供給其他東西。這基本上是各種流處理器,這個概念可能比Haskell和C#都要大得多。

第三,迭代是抽象行爲的封裝,其內部工作隱藏。這可以說更符合面向對象的原則,而不是ML風格的函數式編程,至少在那些鼓吹你使用getter和setter的人所支持的「OO原則」意義上來說,並且認爲控制流應該通過多態性。

鑑於上述情況,我認爲iteratee概念在C#中可以很好地適用,並且將最自然地實現爲IEnumerable的一種反轉等價物,具有組合數據流對象和「推」接口而不是標準的LINQ的「拉」式。

+0

感謝您的好解釋! – firefrorefiddle

+0

@Mike Hartl:對於它的價值,我忘記了Reactive Extensions;在查看鏈接後,查爾斯給出的描述非常清晰,與我描述的相同。 –

相關問題