Я пытаюсь изучить Shapeless (используя версию 2.10.2). Я создал очень простую расширяемую запись:
val rec1 = ("foo" ->> 42) :: HNil
В соответствии с REPL это имеет тип
shapeless.::[Int with shapeless.record.KeyTag[String("foo"),Int],shapeless.HNil]
Я пытаюсь определить простую функцию:
def fun(x: ::[Int with KeyTag[String("foo"), Int], HNil]) = x("foo")
но он даже не компилируется. Я не могу использовать String ( "foo" ) в объявлении типа и получить ошибку.
У меня есть два вопроса:
- Как я могу указать тип расширяемой записи в моем коде?
- При работе с записями с большим количеством полей длина и сложность объявления типа будут неуправляемы. Есть ли способ создать псевдоним для типа, учитывая конкретный экземпляр записи или какой-либо другой способ обхода?
ИЗМЕНИТЬ
Я обнаружил, что:
val rec1 = ("foo" ->> 42) :: HNil
val rec2 = ("foo" ->> 43) :: HNil
var x = rec1
x = rec2
работает хорошо. В заключение rec1, rec2 и x имеют один и тот же тип. Я просто не знаю, как выразить этот тип кода!