0

我有一个简单的Nodes 树,每个树都有一个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在一个地方定义树,然后用一组指定的副作用在另一个地方走树。

4

0 回答 0