Могу ли я использовать shapeless для возврата той же арности HList, что и переданный HList?

Вот пример. Я пытаюсь обернуть некоторый внешний API, который принимает и возвращает ту же арность List:

def externApi(args: List[Int]): List[String] = args.map(_.toString)

Я подумал, что это хороший повод научиться бесформенному, поскольку похоже, что HList сможет это сделать.

def foo(args: HList): HList = ???

Как я могу закодировать тип, который передает HList и возвращает HList одной и той же арности?


person Daniel Shin    schedule 16.01.2016    source источник
comment
возможно, Sized может помочь: github .com/milessabin/shapeless/blob/master/examples/src/main/   -  person stew    schedule 16.01.2016


Ответы (1)


Чтобы расширить комментарий @stew, вы можете использовать Sized для обеспечения равной арности между списками.

import shapeless._
import syntax.sized._

def externApi[N <: Nat](args: Sized[List[Int], N]): Sized[List[String], N] =
    args.map(_.toString)

Применение:

scala> externApi(Sized[List](1, 2, 3, 4))
res0: shapeless.Sized[List[String],shapeless.nat._4] = List(1, 2, 3, 4)

scala> res0 foreach println
1
2
3
4

Я далеко не эксперт по бесформенности, поэтому не знаю, есть ли способ сделать это с HList, но похоже, что ваши коллекции все равно однородны.

person Michael Zajac    schedule 16.01.2016
comment
Это именно то, что мне нужно. Спасибо - person Daniel Shin; 17.01.2016