Попробуйте
def iter(myHList: HList, acc: List[Boolean]): List[Boolean] = {
(myHList: @unchecked) match {
case HNil => acc
case (head: Function1[String, _] @unchecked) :: tail =>
myFunc(head) :: iter(tail, acc)
}
}
(первое @unchecked
подавляет предупреждение о том, что сопоставление с образцом не является исчерпывающим, второе @unchecked
подавляет предупреждение о непроверенном универсальном String
из-за стирания типа).
В качестве альтернативы вы можете соответствовать более безопасному типу. Но обычно писать, что аргумент является просто HList
, а не конкретным A :: B :: ... :: HNil
, слишком грубо. Так как ваша функция действует по-разному на значения разных типов (а именно, HNil
и H :: T
), это Poly
.
object iter extends Poly2 {
implicit val nilCase: Case.Aux[HNil, List[Boolean], List[Boolean]] =
at((_, acc) => acc)
implicit def consCase[A, T <: HList](implicit
tailCase: Case.Aux[T, List[Boolean], List[Boolean]]
): Case.Aux[(String => A) :: T, List[Boolean], List[Boolean]] =
at { case (head :: tail, acc) => myFunc(head) :: iter(tail, acc) }
}
Использование:
def myFunc[T](x: String => T): Boolean = true
iter(((s: String) => s.toUpperCase) :: ((s: String) => s.length) :: HNil, List[Boolean]())
// List(true, true)