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 повысить значение.

Другие вопросы по тегам