bind
имеет подпись App x (Node => Node) => Node
_.child
в этом контексте означает {n: Node => n.child}
, а Node не определяет дочерний элемент. Вот что говорит ваше сообщение об ошибке.
В вашем конкретном случае вы можете ожидать, что он будет работать, потому что вы знаете, что аргумент функции bind применяется к узлу схемы аргумента приложения. Тем не менее, вы должны сказать почти столько же компилятору. И это заставит вас сделать некоторые детали реализации более публичными.
Во-первых, возможно, ваша функция не будет иметь аргумента Node, но что-то более точное. Вы можете иметь тот, у которого есть универсальный параметр:
def bind[N <: Node](app: App, f: N => Node)
Но затем, когда вы звоните f(app.schema)
, вы должны убедиться, что app.schema имеет требуемый тип
class App[N <: Node] {def schema: N}
def bind[N <: Node](app: App[N], f: N => Node) = f(app.schema)
Последнее, вам нужно будет сделать тип вашего приложения val более явным, по крайней мере,
class NodeOfApp{def child: Node}
val app = new App[NodeOfApp]{...}