2015-03-13 12 views
14

che sto cercando di fare quanto segueCaso tipo di argomento costruttore di classe in base al valore precedente argomento

trait Stateful { 
    type State 
} 

case class SystemState(system: Stateful, state: system.State) // does not compile 

Cioè, il tipo di state dipende (il valore di) system. Questo, tuttavia, non è supportato:

illegale digitare metodo dipende: parametro appare nel tipo di un altro parametro nella stessa sezione o meno un

Con argomenti delle funzioni, ho potuto dividere gli argomenti in due liste di argomenti, che non è possibile con un caso costruttore di classe:

def f(system: Stateful)(state: system.State): Unit = {} // compiles 

Il meglio che posso fare è:

case class SystemState[S](system: Stateful { type State = S }, state: S) // compiles 

ma stavo pensando che dovrebbe essere possibile senza un parametro di tipo, dal momento che in dotty, suppongo che i parametri di tipo sono desugared per digitare membri.

La mia domanda è, può essere espressa senza parametri di tipo?

In un contesto più generale, sto esplorando in che misura i parametri del tipo possono essere sostituiti dai membri del tipo e quando è una buona idea farlo.

risposta

8

L'approccio con più elenchi di parametri per tipi dipendenti sfortunatamente è not supported for constructors, quindi no, sarà necessario introdurre un parametro di tipo.

Si potrebbe nascondere questo fatto se diventa fastidio, anche se

trait Stateful { 
    type State 
} 

object SystemState { 
    def apply(system: Stateful)(state: system.State): SystemState = 
    new Impl[system.State](system, state) 

    private case class Impl[S](val system: Stateful { type State = S }, 
          val state: S) 
    extends SystemState { 
    override def productPrefix = "SystemState" 
    } 
} 
trait SystemState { 
    val system: Stateful 
    val state: system.State 
} 

case object Test extends Stateful { type State = Int } 
val x = SystemState(Test)(1234) 
Problemi correlati