Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala树结构和通过隐式参数插入副作用_Scala_Implicit - Fatal编程技术网

Scala树结构和通过隐式参数插入副作用

Scala树结构和通过隐式参数插入副作用,scala,implicit,Scala,Implicit,我有一个简单的节点树s,每个节点都有一个apply方法,该方法接受给定的状态,并返回一个新的状态和树中的下一个节点 trait Node[SE <: SideEffect] { def apply(state: State)(implicit sideEffect: SE): (State, Node[_]) } 但是,如果尝试类似的方法并产生潜在的副作用,则不起作用: def execute[SE <: SideEffect](state: State, node: Node

我有一个简单的
节点树
s,每个节点都有一个
apply
方法,该方法接受给定的
状态
,并返回一个新的
状态
和树中的下一个
节点

trait Node[SE <: SideEffect] {
  def apply(state: State)(implicit sideEffect: SE): (State, Node[_])
}
但是,如果尝试类似的方法并产生潜在的副作用,则不起作用:

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)
                                               ^
def execute[SE(结果,结束)
案例(结果,继续)=>执行(结果,继续)
}
}
:20:错误:推断的类型参数[_0]不符合方法execute的类型参数界限[SE execute(result,continue)
^
:20:错误:类型不匹配;
找到:节点[_0],其中类型为_0
必需:节点[SE]
案例(结果,继续)=>执行(结果,继续)
^
:20:错误:找不到参数副作用的隐式值:SE
案例(结果,继续)=>执行(结果,继续)
^
我想根本的问题是,对
execute
的每个调用都必须已经包含对
execute
的所有后续调用的所有隐式


有鉴于此,有什么方法可以在以后轻松地传递副作用吗?我希望能够在一个地方定义
节点的树,然后在另一个地方带着一组指定的副作用遍历该树。

您是否尝试过应用return
(State,Node[SE])
而不是
(State,Node[\u])
?这将要求第二个节点与第一个节点具有相同的副作用类型,否?是的。您不能做的是在运行时查找节点的实际类型,然后期望编译器以某种方式追溯查找隐式参数…也许您可以尝试使其与显式传递的参数一起工作,然后查看后来如何用隐式替换其中的一些?从您展示的内容来看,我对您的数据结构感到困惑,因为树的形状似乎取决于初始状态。是的,您是对的,形状取决于我描述的设计中的初始状态。最终我认为我想要做的是不可能的(很容易?)。
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)
                                               ^