Бесформенный пример вычисления ошибки несоответствия типов дельт - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь повторить пример из разговора «Бесформенный легкий» (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. Не уверен, почему это не работает

...