Sto tentando di imparare Shapeless (utilizzando la versione 2.10.2). Ho creato un semplice record di estendibile:Trasferimento di un record estendibile senza forma a una funzione
val rec1 = ("foo" ->> 42) :: HNil
Secondo il REPL, questo è di tipo
shapeless.::[Int with shapeless.record.KeyTag[String("foo"),Int],shapeless.HNil]
Sto cercando di definire una semplice funzione:
def fun(x: ::[Int with KeyTag[String("foo"), Int], HNil]) = x("foo")
ma non viene nemmeno compilato. Non posso usare una stringa ("pippo") nella dichiarazione del tipo e ottenere un errore.
Ho due domande:
- Come posso specificare il tipo di record estendibile nel mio codice?
- Quando si lavora con record con più campi, la lunghezza e la complessità della dichiarazione del tipo saranno ingestibili. C'è un modo per creare un alias per il tipo, data una particolare istanza di un record, o qualche altra soluzione alternativa?
EDIT
ho scoperto che:
val rec1 = ("foo" ->> 42) :: HNil
val rec2 = ("foo" ->> 43) :: HNil
var x = rec1
x = rec2
funziona bene. Concludo rec1, rec2 e x sono dello stesso tipo. Solo non so come esprimere quel tipo di codice!
Per la cronaca, Miles ha appena detto [su Twitter] (https://twitter.com/milessabin/status/388623399624646656) che potrebbe essere in grado di "rimuovere parte del disordine sintattico prima che la 2.0.0 diventi definitiva". –
Se abbiamo molte funzioni come divertimento, dobbiamo ripetere il parametro implicito per ciascuna. È doloroso e errorprone se tali funzioni devono accedere a più di un campo (ad es. Foo, bar, ...). C'è un modo per ridimensionare le dichiarazioni dei selettori? – bhericher