我将使用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