我正在构建一个通用函数,该函数接受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
...但是我目前无法想出一种方法来使它变得更好
TC
为Option
。 注意:我认为这作为回答是有用的,但我不接受它-希望有人会提出更通用,更美观的解决方案。
关于scala - 将Shapelessless Hlist类型F [T1]::...:F [Tn]::HNil映射到类型T1::...::Tn::HNil(类型级别排序),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26495891/