Я обдумывал проблему дизайна в библиотеке, над которой работаю, и понял, что использование экзистенциальных типов может позволить мне изменить мой дизайн таким образом, чтобы упростить многие части моей библиотеки. Тем не менее, я не могу заставить его работать.
Мне кажется, что myBuilder
соответствует типу MultiSignalBuilder[E, R] forSome { type E[+X] >: Element[X] }
, где Element[X]
соответствует MultiSignalElement[X]
, но компилятор говорит, что это не так. Похоже, это связано с тем, что Е является типом более высокого порядка. Почему это не работает, и есть ли способ это исправить?
class MultiSignalElement[+T] {
}
abstract class MultiSignal[+T] {
type Element[+X] <: MultiSignalElement[X]
val element : Element[T]
def transform[R[+X] <: MultiSignal[X]](builder : MultiSignalBuilder[E, R] forSome { type E[+X] >: Element[X] }) : R[T] =
builder.buildNew(element)
}
abstract class MultiSignalBuilder[-E[+X] <: MultiSignalElement[X], +R[+X] <: MultiSignal[X]] {
def buildNew[T](element : E[T]) : R[T]
}
object myBuilder extends MultiSignalBuilder[MultiSignalElement, MultiSignal] {
def buildNew[T](e : MultiSignalElement[T]) = new MultiSignal[T]() {
type Element[+X] = MultiSignalElement[X]
val element = e
}
}
val multiSignal = new MultiSignal[Int] {
type Element[+X] = MultiSignalElement[X]
val element = new MultiSignalElement()
}
multiSignal.transform(myBuilder) //type error on this line
multiSignal.transform[MultiSignal](myBuilder) //type error on this line