Неявное значение HList Poly1 Mapper для сопоставителя параметров не найдено

Я использую shapeless 2.1.0 -scala 2.11, jdk 1.7: у меня есть черта

trait Input[T]{
  def location:String
}

 object location extends Poly1 {
      implicit def caseInput[T] = at[Input[T]](l => l.location)
 }

val list = new Input[String] {def location:String="/tmp"} :: HNil

list.map(location)

Это правильно возвращается в моей консоли

shapeless2.::[String,shapeless2.HNil] = /tmp :: HNil

Однако, когда у меня точно такая же логика в функции - где HList возвращается мне из другого вызова функции, и я отображаю на нем функцию, я получаю ошибку времени компиляции

:could not find implicit value for parameter mapper: shapeless.ops.hlist.Mapper[location.type,shapeless.::[Input[String]{...},shapeless.HNil]]

Я подозреваю, что, вероятно, упускаю некоторые скрытые факты. Я проверил бесформенные тесты и документацию - надеюсь, я не пропустил ничего слишком очевидного.

Я могу создать полный пример, чтобы воссоздать проблему, если это не что-то очевидное - спасибо за прочтение.

Бест, Амит

Обновлено: с примером

trait Input [T] {def location: String значение def: T}

 trait location extends Poly1 {
    implicit def caseList[T] = at[Input[T]](l => l.location)
  }


  object testfun extends location {
    implicit val atString = at[Input[String]](_.location)
    implicit val atInt = at[Input[Int]](_.location)
    implicit val atLong = at[Input[Long]](_.location)
  }

  def inputs:HList={
    val str = new Input[String]{
      override def location: String = "/tmp/string"
      override def value: String = "here it is"
    }
    val ints = new Input[Int]{
      override def location: String = "/tmp/1"
      override def value: Int = 1
    }
    val longs = new Input[Long]{
      override def location: String = "/tmp/1l"
      override def value: Long = 1l
    }
    str::ints::longs::HNil
  }
  >>>println(inputs.map(testfun))

 could not find implicit value for parameter mapper: shapeless.ops.hlist.Mapper[HListTest.testfun.type,shapeless.HList]

Если бы я удалил возвращаемый тип входов def, я не получил бы никаких ошибок.


person Amit    schedule 13.03.2015    source источник
comment
На самом деле невозможно будет помочь, не имея возможности увидеть контекст вызова в случае сбоя.   -  person Miles Sabin    schedule 13.03.2015
comment
да. Извините, Майлз - прилагаю пример   -  person Amit    schedule 13.03.2015
comment
Вы определили тип результата inputs как HList, который отбрасывает информацию о типе, необходимую для Mapper. Попробуйте определить его как Input[String] :: Input[Int] :: Input[Long] :: HNil или позвольте сделать вывод.   -  person Miles Sabin    schedule 14.03.2015
comment
Как я могу это сделать? Пример, который у меня выше, упрощен - в моем реальном коде абстрактный класс типизирован и предоставляет тип возвращаемого ввода, аналогичный   -  person Amit    schedule 14.03.2015
comment
Истекло время редактирования комментария: gist.github.com/kumaramit01/80ca29b46d2c07e55b0b   -  person Amit    schedule 14.03.2015


Ответы (1)


Оказалось, что суть, которую я опубликовал, отлично работает - это проблема с Intellij.

gist.github.com/kumaramit01/80ca29b46d2c07e55b0b

Intellij продолжал указывать синтаксическую ошибку, когда у меня был тип возврата, определенный как

Input[String] :: Input[Int] :: Input[Long] :: HNil

Амит

person Amit    schedule 14.03.2015