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

标签 scala shapeless type-level-computation

我正在构建一个接受 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

...但我目前无法想出一种方法来使这更好
  • 摆脱包装类;
  • 让 Scala 推断 TC成为 Option .

  • 注意:我认为这作为一个答案有点有用,但我不接受它——希望有人能提出一个更通用、更漂亮的解决方案。

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

    相关文章:

    java - Scala 在 Java 中的类型等价物

    Scala 使用 shapeless 在自然变换上组合更高级的副产品

    haskell - Haskell 和 Idris : Reflection of Runtime/Compiletime in the type universes 之间的区别

    java - 使用运行时反射确定不在标准库(Java 或 Scala)中的基类

    scala - 我可以使用 sbt 构建自己的独立控制台吗?

    scala - 解码无形标记类型

    haskell - 如何让 GHC 相信递归类型的类型相等性

    scala - 隐式解析失败?

    scala - 当数据尚未加载时不可能获得工件。 IvyNode = org.scala-lang#scala-library;2.10.3

    scala - 为什么此代码在 Scala 2.11 中进行类型检查,我该怎么办?