我有一个Node
s的简单树,每个树都有一个apply
方法,它接受一个给定的State
并返回一个新的State
和下一个{{ 1}}在树上。
Node
正如您所看到的,我希望能够在最终应用该功能时传递特定类型的副作用。
对于单个节点,这可以正常工作。但是,当我想以递归方式下降树时,它似乎崩溃了。例如,没有副作用,以下代码有效:
trait Node[SE <: SideEffect] {
def apply(state: State)(implicit sideEffect: SE): (State, Node[_])
}
但是,如果尝试类似的东西采取隐含的副作用,它不起作用:
def execute(state: State, node: Node): (State, Node) = node(state) match {
case (result, end: End) => (result, end)
case (result, continue) => execute(result, continue)
}
我想根本问题是每次调用def execute[SE <: SideEffect](state: State, node: Node[SE])(implicit sideEffect: SE): (State, Node[_]) = {
node(state) match {
case (result, end: End) => (result, end)
case (result, continue) => execute(result, continue)
}
}
<console>:20: error: inferred type arguments [_0] do not conform to method execute's type parameter bounds [SE <: SideEffect]
case (result, continue) => execute(result, continue)
^
<console>:20: error: type mismatch;
found : Node[_0] where type _0
required: Node[SE]
case (result, continue) => execute(result, continue)
^
<console>:20: error: could not find implicit value for parameter sideEffect: SE
case (result, continue) => execute(result, continue)
^
都必须已经涵盖了execute
所有后续调用的所有含义。
鉴于此,以后是否有任何方法可以轻松传递副作用?我希望能够在一个地方定义execute
的树,然后在具有指定副作用的另一个地方走树。