使用树遍历函数键入问题

时间:2014-05-06 14:46:03

标签: scala abstract-data-type

对于我的应用程序正在使用的数据,我试图给数据结构(这是一棵树)一个内置的遍历方法,以便调用者可以简单地调用它,提供在分支(行)和叶子(容器)。为了允许输出任何类型的T,而不仅仅是树数据的映射,我将调用者的责任加入调用子树的结果,他们必须明确地使用{{1}回调,它被传递给提供的descend函数。我的问题是我收到以下错误:

rowVisitor

以下是我的数据结构代码和Error:(45, 40) missing parameter type for expanded function The argument types of an anonymous function must be fully known. (SLS 8.5) Expected type was: T def descend(node: Content): T = { ^ 方法:

traverse

通常,会在模板中调用此 trait Layout { def contentTree: Content def traverse[T](rowVisitor: (Row, Content => T) => T, containerVisitor: Container => T): T = { def descend(node: Content): T = { case Row(columns) => rowVisitor(Row(columns), descend) case Container(name) => containerVisitor(Container(name)) } descend(contentTree) } } sealed trait Content case class Row(columns: Seq[Content]) extends Content case class Container(name: ContainerId) extends Content 函数来呈现此内容树,因此traverse将是Play THtml

1 个答案:

答案 0 :(得分:0)

根据评论,这是更正:

def traverse[T](rowVisitor: (Row, Content => T) => T)(containerVisitor: Container => T): T = {
  def descend(node: Content): T = node match {
    case Row(columns) => rowVisitor(Row(columns), descend)
    case Container(name) => containerVisitor(Container(name))
  }
  descend(contentTree)
}

我还拆分参数列表,以便可以调用它:

layout.traverse[OutputType] { (row, descend) =>
    /* call descend on each column of the row, and then aggregate to OutputType */
} { container =>
    /* do something with container producing OutputType */
}

在第一个要编译的匿名函数中,似乎需要在descend上使用显式类型参数规范或显式类型。不确定是否有办法解决这个问题。