我有一个简单的Node
s 树,每个树都有一个apply
方法,它接受一个给定的State
并返回树中的一个新State
的和下一个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
。
鉴于此,以后有什么方法可以轻松传递副作用吗?我希望能够Nodes
在一个地方定义树,然后用一组指定的副作用在另一个地方走树。