2016-07-21 3 views
0

Дано:Установить границы для членов типа в пределах типа псевдонима в Scala

trait Record { 
    type ID 
    val id: ID 
} 

trait DataSource { 
    type ID 
    def read(id: ID): Try[R] 
} 

Я хотел бы быть в состоянии описать функцию read обобщенно.

type Reader[R <: Record, DS <: DataSource] = (DS#ID) => Try[R] 

Как я могу гарантировать безопасность типа здесь такие, что DS#ID не будет неодинаковый типа как R#ID? Я пытался ...

type Reader[R <: Record, DS <: DataSource, R#ID <: DS#ID] = (DS#ID) => Try[R] 

Но doens't компиляции. Каков правильный синтаксис этой ситуации?

ответ

0

При работе с параметрами типа Reader необходимо вытащить ID как собственный параметр.

type Reader[R <: Record, DS <: DataSource, ID] = (ID) => Try[R] 

После того, как это сделано, можно затем поместить дополнительные границы на него ...

type Reader[R <: Record, DS <: DataSource, ID <: DS#ID =:= R#ID] = (ID) => Try[R] 
Смежные вопросы