我將使用C#語法,因爲我熟悉它,但它並不是特定於語言的。
什麼語言功能可以允許從訪問者到序列的轉換?
比方說,我們想要提供一個API來檢查
Tree
並對每個
Node
做些事情。
解決方案1:void Visit(Tree tree, Action<Node> action)
它需要一個tree
,並在樹中的每個節點上調用action
。
解決方案2:IEnumerable<Node> ToEnumerable(Tree tree)
它轉換tree
到一個平面懶序列,所以我們可以走了過來,並在每個節點上調用action
。
現在,讓我們看看我們如何將一個API轉換爲另一個。
這是非常微不足道的對ToEnumerable
頂部提供Visit
:
void Visit(Tree tree, Action<Node> action) {
ToEnumerable(tree).ForEach(action);
}
然而,有沒有在這將允許對Visit
頂部提供ToEnumerable
任何語言概念/功能(如懶序列,所以列表不是事先創建的)?
不知道你在問什麼...你想要一個類/模式,它會自動創建一個懶惰的IEnumerable'對象層次結構,給定一個適當的訪問者方法? (如果是這樣,我懷疑答案是「否」,除非對象還支持只遍歷給定對象的「children」的* flat *枚舉)。 – 2012-07-13 13:31:26
@KonradRudolph是的。儘管我不需要課堂/模式,更像是一種語言特徵或概念。我有一種感覺可能與延續有關,但我對他們不夠熟悉。 – 2012-07-13 13:35:33
我認爲這是結構的屬性,而不是任何語言功能。 Haskell的Foldable(http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Foldable.html)中最純粹的(如最抽象的)表示,特別參見foldMap 。 – 2012-07-13 14:17:40