Я пытаюсь повторить пример из разговора «Бесформенный легкий» (https://www.youtube.com/watch?v=JKaCCYZYBWo). Код для этого можно найти здесь: https://harrylaou.com/scala/shapeless/deltas/
В качестве альтернативы см. Ниже для
sealed trait Diff[A]
final case class Identical[A](value: A) extends Diff[A]
final case class Different[A](left: A, right: A) extends Diff[A]
object Diff {
def apply[A](left: A, right: A): Diff[A] =
if (left == right) Identical(left)
else Different(left, right)
}
trait SimpleDelta[R <: HList] extends DepFn2[R, R] {
type Out <: HList //Result is bounded by HList
}
object SimpleDelta {
/** type alias Aux adds as a type parameter the return Type.
* It is convenient in order to constrain it
* by passing it as a type parameter.
*/
type Aux[I <: HList, O <: HList] = SimpleDelta[I]{ type Out = O }
//Recursive Algorithm
implicit def hnilDelta: Aux[HNil, HNil] = new SimpleDelta[HNil] {
type Out = HNil
def apply(l: HNil, r: HNil): Out = HNil
}
implicit def hconsDelta[H, T <: HList, DT <: HList]
(implicit tailDelta: Aux[T, DT]) : Aux[H::T, Diff[H] :: DT] =
new SimpleDelta[H :: T]{
type Out = Diff[H] :: DT
def apply(l: H :: T, r: H :: T) : Out =
Diff(l.head, r.head) :: tailDelta(l.tail, r.tail)
}
def apply[A, R <: HList](l: A, r: A)
(implicit genA: Generic.Aux[A, R],
delta: SimpleDelta[R]): delta.Out =
delta(genA.to(l), genA.to(r))
}
В этой строке здесь
def apply(l: H :: T, r: H :: T) : Out =
Diff(l.head, r.head) :: tailDelta(l.tail, r.tail)
Я получаю ошибку "несоответствие типов". Где Обязательным типом является «Out», а типом «Найдено» является Diff [H] :: DT.
Тип, который указан непосредственно над этой строкой, это type Out = Diff[H] :: DT
. Не уверен, почему это не работает