将无形hlist类型F [T1] :: ... :: F [Tn] :: HNil映射到类型T1 :: ... :: Tn :: HNil(类型级别排序)

Eri*_*lun 8 scala type-level-computation shapeless

我正在构建一个泛型函数,它接受一个HList表单F[T1] :: ... :: F[Tn] :: HNil,将其转换为a F[T1 :: ... :: Tn :: HNil]然后需要将其传递到传入的块中.但是,为了使其工作,我需要提取HList类型那个F[_].我在Shapeless'找到了一些与之相关的东西hlistconstraints:

/**
 * Type class witnessing that every element of `L` has `TC` as its outer type constructor. 
 */
trait UnaryTCConstraint[L <: HList, TC[_]]
Run Code Online (Sandbox Code Playgroud)

...但这只能用于验证传入的hlist确实是由...组成的F[_]; 然而似乎没有办法提取那个_位,以便对自己的hlist说.

我应该在哪里寻找能够找到工作的东西?或者我不应该期望找到任何开箱即用的东西,而是自己构建类型计算?

披露:这个问题是对包含一些F [_]的元组/ hlist的通用转换/折叠/映射的辅助,但在我看来,它至少与独立问题一样有用.

Eri*_*lun 3

\n\n

看起来Sequencer已经这样做了:

\n\n
import scala.language.higherKinds\n\nclass Wrap[TC[_]] {\n  def foo[L1 <: HList, L2 <: HList](xs: L1)(implicit\n    seq: Sequencer.Aux[L1, TC[L2]] // L2 is the type we\'re looking for\n  ): L2 = ???\n}\n\nval ret = new Wrap[Option].foo(1.some :: 2.some :: HNil)\n// ret now has type Int :: Int :: HNil\n
Run Code Online (Sandbox Code Playgroud)\n\n

...但我目前无法想出一种方法来使这变得更好

\n\n
    \n
  • 摆脱包装类;
  • \n
  • 让 Scala 推断TCOption.
  • \n
\n\n

注意:我认为这作为一个答案有点有用,但我不接受它 \xe2\x80\x94 希望有人能提出一个更通用和更好看的解决方案。

\n