加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 将无形hlist类型F [T1] :: … :: F [Tn] :: HNil映射到

发布时间:2020-12-16 08:54:10 所属栏目:安全 来源:网络整理
导读:我正在构建一个泛型函数,它接受F [T1] :: … :: F [Tn] :: HNil形式的HList,将其转换为F [T1 :: … :: Tn: :HNil]然后需要将它传递给传入的块.但是,为了使其工作,我需要在F [_]中提取HList类型.我在Shapeless’ hlistconstraints 下发现了一些与之相关的东
我正在构建一个泛型函数,它接受F [T1] :: … :: F [Tn] :: HNil形式的HList,将其转换为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为选项.

注意:我认为这是一个有用的答案,但我不接受它 – 希望有人会想出一个更通用,更好看的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读