0

Node私はs の単純なツリーを持っています。各ツリーにapplyは、与えられたものを取り、ツリー内の新しいものと次のものStateを返すメソッドがあります。StateNode

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