我正在构建一个接受 HList
的通用函数形式 F[T1] :: ... :: F[Tn] :: HNil
, 将其转换为 F[T1 :: ... :: Tn :: HNil]
然后需要将其传递到传入的块中。但是,为了使其工作,我需要提取该 F[_]
中的 HList 类型。 .我在 Shapeless' hlistconstraints
下找到了一些相关的东西:
/**
* Type class witnessing that every element of `L` has `TC` as its outer type constructor.
*/
trait UnaryTCConstraint[L <: HList, TC[_]]
...但这只能用于验证传入的 hlist 确实仅由
F[_]
组成。 ;然而似乎没有办法提取_
对自己的 hlist 可以这么说。我应该在哪里寻找可以完成这项工作的东西?或者我不应该期望找到任何开箱即用的东西,而是自己构建类型计算?
披露:这个问题是对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
...但我目前无法想出一种方法来使这更好
TC
成为 Option
. 注意:我认为这作为一个答案有点有用,但我不接受它——希望有人能提出一个更通用、更漂亮的解决方案。
关于scala - 将 Shapeless hlist 类型 F[T1]::...::F[Tn]::HNil 映射到类型 T1::...::Tn::HNil(类型级别排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495891/