Shapeless: Попытка ограничить элементы HList их типом
Вопрос 1 - Основные ограничения LUB
Моя первая попытка поиграться с существующими LUBConstraints не удалась из-за отсутствия доказательств (см. Блок кода ниже). Любой намек почему? Разве пустой список не является допустимым списком длинных? ни один элемент не нарушает ограничение.
import shapeless.ops.coproduct
import shapeless.{::, :+:, Coproduct, HNil, HList}
object testLUBConstraints {
import shapeless.LUBConstraint._
// !!! see comment on question - this satisfies the implicit below!!!
// implicit val hnilLUBForLong = new LUBConstraint[HNil.type, Long] {}
def acceptLong[L <: HList : <<:[Long]#λ](l: L) = true
val validLong = acceptLong(1l :: HNil)
val validEmpty = acceptLong(HNil)
// => WHY??? Error: could not find implicit value for evidence parameter of type shapeless.LUBConstraint[shapeless.HNil.type,Long]
// MY EXPECTATION WAS: 'implicit def hnilLUB[T] = new LUBConstraint[HNil, T] {}' defined within LUBConstraint companion should provide so
// val invalid = acceptLong(1.0d :: HNil) -> fails due to missing evidence (as expected)
}
Любая помощь приветствуется.
Вопрос 2 - Собственное ограничение с использованием Coproduct(разделить на отдельный вопрос: Shapeless: собственное ограничение HList с использованием Coproduct)
Вопрос 3 - ограничить классы дел по типам параметров(разделить на отдельный вопрос: Shapeless: ограничение типов дел)
1 ответ
Предполагаемый тип значения HNil
будет синглтон типа HNil.type
, который является правильным подтипом HNil
, Поскольку классы типа как LUBConstraint
инвариантны, любой доступный экземпляр для HNil
не будет найден, если вы запрашиваете экземпляр для HNil.type
,
Там было некоторое обсуждение изменения определения HNil
так что это будет работать, но это не тривиально, и не ясно, что все последствия изменений желательны. А пока можешь написать HNil: HNil
повысить значение.