Я использую бесформенные и имеют следующий метод, чтобы вычислить разницу между двумя HLists:Shapeless HList проверка
def diff[H <: HList](lst1: H, lst2:H):List[String] = (lst1, lst2) match {
case (HNil, HNil) => List()
case (h1::t1, h2::t2) if h1 != h2 => s"$h1 -> $h2" :: diff(t1, t2)
case (h1::t1, h2::t2) => diff(t1, t2)
case _ => throw new RuntimeException("something went very wrong")
}
Поскольку оба параметра метода принимают H
, я бы ожидать HLists различных типов не скомпилируйте здесь. Например:
diff("a" :: HNil, 1 :: 2 :: HNil)
не должны компилировать, но он делает, и это приводит к ошибке во время выполнения: java.lang.RuntimeException: something went very wrong
. Есть ли что-то, что я могу сделать для параметров типа, чтобы этот метод принимал только две стороны с одинаковыми типами?
Вы, похоже, не обрабатываете случай, когда пустая строка только одного из 'lst1' или' lst2', что вполне может объяснить вашу ошибку. –
Я понимаю ошибку, но мне нужна ошибка компиляции, а не время выполнения. – triggerNZ
О, я вижу, чего вы пытаетесь достичь. К сожалению, базовая черта 'HList' непараметризирована, и поэтому в вашем методе вызов' H' просто разрешен для 'Hlist' (который действительно является супертипом любого' Hlist', независимо от конкретных типов элементов). См. Мой ответ. –