对于我的应用程序正在使用的数据,我试图给数据结构(这是一棵树)一个内置的遍历方法,以便调用者可以简单地调用它,提供在分支(行)和叶子(容器)。为了允许输出任何类型的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 T
或Html
。
答案 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
上使用显式类型参数规范或显式类型。不确定是否有办法解决这个问题。