Wczoraj odkryłem Shapeless z kilkoma kolegami i zdecydowaliśmy się napisać metodę zabawki, aby dodać ją do pierwszego parametru klasy sprawy, gdy parametr ten to Int
:Więcej dowodów potrzebnych niż w przypadku metody wykorzystującej Shapeless
def addOneToCaseClass[C, H <: HList, E, T <: HList]
(c: C)
(implicit gen: Generic.Aux[C, H],
h: IsHCons.Aux[H, E, T],
ev: E =:= Int,
ev2: (Int :: T) =:= H
): C = {
val hList = gen.to(c)
val elem = hList.head
val tail = hList.tail
val newElem = elem + 1
gen.from(newElem :: tail)
}
wydaje mi się, że parametr ev2
jest zbędna - na pewno można wywnioskować, że E :: T =:= Int :: T
, ale kompilator nie był w stanie dokonać tego dopuścić.
Czy istnieje jakiś szczególny powód, dla którego?
To w żaden sposób nie odpowiada na twoje pytanie, ale czy działa, jeśli całkowicie pozbyłeś się E? '[C, H, T]', 'IsHCons.Aux [H, Int, T]', itp.? Z E wciąż obecnym, dowolne dwa z 'h',' ev' i 'ev2' powinny sprawić, żeby to działało - czy jakakolwiek z tych kombinacji działa? – ellisbben