Quantificação limitada por F através do membro type em vez do parâmetro type?
Eu gostaria de mover um parâmetro de tipo para um membro de tipo.
Este é o ponto de partida que funciona:
trait Sys[S <: Sys[S]] {
type Tx
type Id <: Identifier[S#Tx]
}
trait Identifier[Tx] {
def dispose()(implicit tx: Tx): Unit
}
trait Test[S <: Sys[S]] {
def id: S#Id
def dispose()(implicit tx: S#Tx) {
id.dispose()
}
}
O que me incomoda é que estou carregando um parâmetro de tipo[S <: Sys[S]]
em todas as minhas bibliotecas. Então o que eu estava pensando é isto:
trait Sys {
type S = this.type // ?
type Tx
type Id <: Identifier[S#Tx]
}
trait Identifier[Tx] {
def dispose()(implicit tx: Tx): Unit
}
trait Test[S <: Sys] {
def id: S#Id
def dispose()(implicit tx: S#Tx) {
id.dispose()
}
}
Que falha ...S#Tx
eS#Id
tornou-se de alguma forma desanexado:
error: could not find implicit value for parameter tx: _9.Tx
id.dispose()
^
Algum truque ou alteração que faça funcionar?
EDITAR : Para esclarecer, estou principalmente esperando para corrigir o tipoS
emSys
para fazer funcionar. Existem inúmeros problemas no meu caso usando tipos dependentes de caminho. Para dar apenas um exemplo que reflete as respostas de pedrofuria e Owen:
trait Foo[S <: Sys] {
val s: S
def id: s.Id
def dispose()(implicit tx: s.Tx) {
id.dispose()
}
}
trait Bar[S <: Sys] {
val s: S
def id: s.Id
def foo: Foo[S]
def dispose()(implicit tx: s.Tx) {
foo.dispose()
id.dispose()
}
}
<console>:27: error: could not find implicit value for parameter tx: _106.s.Tx
foo.dispose()
^
Tente fazer issodef foo: Foo[s.type]
para lhe dar uma ideia de que isso não leva a nada.