Próbuję się nauczyć Bezkształtnego (używając wersji 2.10.2). Stworzyłem bardzo prosty rozszerzalnej rekordu:Przekazywanie bezkształtnego, rozszerzalnego rekordu do funkcji
val rec1 = ("foo" ->> 42) :: HNil
Według REPL, to musi wpisać
shapeless.::[Int with shapeless.record.KeyTag[String("foo"),Int],shapeless.HNil]
próbuję zdefiniować prostą funkcję:
def fun(x: ::[Int with KeyTag[String("foo"), Int], HNil]) = x("foo")
, ale nie kompiluje się. Nie mogę użyć ciągu ("foo") w deklaracji typu i uzyskać błąd.
Mam dwa pytania:
- W jaki sposób można określić typ Extensible rekordu w moim kodu?
- Podczas pracy z rekordami zawierającymi więcej pól długość i złożoność deklaracji typu będą niemożliwe do zarządzania. Czy istnieje sposób na utworzenie aliasu dla danego typu, biorąc pod uwagę konkretne wystąpienie rekordu lub inne obejście?
EDIT
I odkryli, że:
val rec1 = ("foo" ->> 42) :: HNil
val rec2 = ("foo" ->> 43) :: HNil
var x = rec1
x = rec2
działa dobrze. Wnioskuję rec1, rec2 i x są tego samego typu. Po prostu nie wiem, jak wyrazić ten typ w kodzie!
Dla przypomnienia, Miles właśnie powiedział [na Twitterze] (https://twitter.com/milessabin/status/388623399624646656), że może być w stanie "usunąć część składniowego bałaganu przed końcem 2.0.0". –
Jeśli mamy wiele funkcji, takich jak zabawa, musimy powtórzyć niejawny parametr dla każdego. Jest to bolesne i błąd, jeśli te funkcje muszą uzyskać dostęp do więcej niż jednego pola (np. Foo, bar, ...). Czy istnieje sposób na zliczanie deklaracji selektorów? – bhericher