gpt4 book ai didi

Scala:涉及匿名子类、回调和类型参数的棘手案例

转载 作者:行者123 更新时间:2023-12-04 23:07:51 24 4
gpt4 key购买 nike

我什至不知道如何描述我在做什么,除了一个例子:

class Node

abstract class App {
def schema: Node
}

def bind(app: App, f: Node => Node) {
f(app.schema)
}

val app = new App {
val schema = new Node {
val child = new Node
}
}

bind(app, _.child)

这不编译。我得到: error: value child is not a member of this.Node来自 bind称呼。

我不确定如何解决这个问题,但我认为它可能涉及使用参数化类型。我需要 f 的类型的参数为实际 Node 的参数分配给 schema 的子类.

编辑:我无法明确命名我的 Node子类型,就像在现实生活中一样,我有完整的静态定义树 Node s 并且命名它们是不切实际的。

最佳答案

Ǹode没有方法child所以类 App 必须保留封闭节点的参数:

abstract class App[N <: Node] {
def schema: N
}

然后你可以扩展 Node包括 child :
class ParentNode extends Node {
def child = new ParentNode
}

最后你可以写 bind作为:
 def bind[N <: Node](app: App[N], f: N => N) = {
f(app.schema)
}

val app = new App[ParentNode] {
val schema = new ParentNode
}

关于Scala:涉及匿名子类、回调和类型参数的棘手案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917685/

24 4 0