我正在构建一个通用函数,该函数接受HList形式的F[T1] :: ... :: F[Tn] :: HNil,将其转换为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[_]]

...但这只能用于验证传入的hlist确实仅由F[_]组成;但是似乎没有办法提取该_位,以便说出自己的名字。

我应该在哪里寻找可以做的工作?还是我不应该只希望发现任何开箱即用的东西,而是自己构建类型计算?

披露:这个问题是Generic transform/fold/map over tuple/hlist containing some F[_]的辅助,但在我看来,它至少与独立问题一样有用。

最佳答案

看来Sequencer已经做到了:

import scala.language.higherKinds

class Wrap[TC[_]] {
  def foo[L1 <: HList, L2 <: HList](xs: L1)(implicit
    seq: Sequencer.Aux[L1, TC[L2]] // L2 is the type we're looking for
  ): L2 = ???
}

val ret = new Wrap[Option].foo(1.some :: 2.some :: HNil)
// ret now has type Int :: Int :: HNil

...但是我目前无法想出一种方法来使它变得更好
  • 摆脱包装器类;
  • 具有Scala的
  • 推断TCOption

  • 注意:我认为这作为回答是有用的,但我不接受它-希望有人会提出更通用,更美观的解决方案。

    关于scala - 将Shapelessless Hlist类型F [T1]::...:F [Tn]::HNil映射到类型T1::...::Tn::HNil(类型级别排序),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26495891/

    10-09 02:09