当前位置: 首页 > 知识库问答 >
问题:

用一般性状的子类映射HList

史旺
2023-03-14

我试图在一个不成形的HList上映射一个poly1函数。其元素是参数化特征的子类。然而,我得到了错误“找不到映射器的隐式值”。下面是一个基本示例:

import shapeless._

trait Drink[+A]{
  def v: A
}

case class Water(v: Int) extends Drink[Int]
case class Juice(v: BigDecimal) extends Drink[BigDecimal]
case class Squash(v: BigDecimal) extends Drink[BigDecimal]


object pour extends Poly1{
  implicit def caseInt: Case.Aux[Drink[Int], Int] =
    at(o => o.v)
  implicit def caseDec: Case.Aux[Drink[BigDecimal], BigDecimal] =
    at(o => o.v)
}

object Proc {

  type I = Water ::Squash ::Juice :: HNil
  type Req = Int ::BigDecimal ::BigDecimal :: HNil

  val drinks: I = Water(10)::Squash(15.0):: Juice(1.0)::HNil

  def make()(implicit m: ops.hlist.Mapper.Aux[pour.type, I, Req]): Req  = { drinks.map(pour)}

}

运行此代码会产生错误:(21,27)无法找到参数m的隐式值:shapeless。ops。hlist。映射器。辅助[pour.type,Proc.I,Proc.Req]

虽然这看起来像一个简单的问题,但我还没有在其他答案中找到(或认识到)解决方案。我目前的解决方法是在poly中为dink的每个子类定义一个case。这显然不适用于该特征的许多子类。有没有更好的解决方案(可能是使用TypeTags)?

更新

对于任何(合理的)Poly1函数,这个问题的一般答案由@Jasper\u M给出。(这个问题在使用具有不变容器的无形状HLists时得到进一步推广。)对于特定转换=

import syntax.std.tuple._
import poly._

def makeTwo(): Req =  (drinks.tupled flatMap identity).productElements

它给出了10:15.0:1.0:HNil。(请注意,Intellij 2017.2.6中的productElements被错误标记为错误。此外,“未耦合”版本的平面映射标识导致“隐式未找到”错误。)


共有1个答案

裴俊能
2023-03-14

尝试使用多态方法

object pour extends Poly1{
  implicit def caseInt[A <: Drink[Int]] =
    at[A](o => o.v)
  implicit def caseDec[A <: Drink[BigDecimal]] =
    at[A](o => o.v)
}
 类似资料:
  • 我构建了以下内容: 上面的代码非常好,非常棒。然而,我仍然想要更多。我希望允许任何Iterable,而不是指定我的HList将包含列表。这样地: 第二个版本无法编译,并显示消息“无法找到参数映射器的隐式值:shapeless.ops.hlist.mapper[iterateOverHList.type,shapeless:[List[Int],shapeless:[List[String],sha

  • 问题内容: 我必须制作一个拼贴项目的域层。我们几乎没有标准,例如我们必须使用Hibernate,数据库也已修复。 数据库的相关部分几乎如下所示: 总线实体 (表1) 总线编号 公交专用信息 总线类型 (表2) BusTypeId 座位数 … 子类鉴别器 我遇到的问题是,在域层中有2种类型的总线通过BusType表中的标识符进行区分: 有没有办法用Hibernate和JPA映射类似的东西?谢谢你的回

  • 我有一个调用C函数的Python 3程序。C函数在成功时返回一个整数:0,或在失败时返回相应的。失败时,Python代码可以简单地引发。但我更希望它提出的适当子类。 例如,如果Python程序得到返回代码2,它应该引发,这是的子类。通过执行以下三个步骤,我已经可以找到正确的子类。显然,性能不是问题,因为对于的所有值,我只需要在每个版本的Python 3中执行一次这些步骤,并缓存结果。 查找的所有子

  • 我有两个表,第一个表包含公司id、公司名称和国家名称,第二个表包含公司相关的详细信息和一对一的映射。 我想使用Hibernate进行以下映射:- 公司表的Company_id应该映射company_detail表的company_id,所以我在POJO中设置了以下映射 另外,在setter中添加以下代码:- 这段代码运行良好,在保存公司时只有一个问题,null存储在company_detal的co

  • 我有基类orderItem并且有子类DeviceItem和ServiceItem。我提供了下面的定义。当我收到这个请求时,我执行dozer映射以将jaxb模型转换为我创建的另一个数据模型。我的数据模型也有相同的OrderItem、DerviceItem和DeviceItem类,它们是POJO。当我进行dozer映射时,类会映射到OrderItem(基类)而不是专门的子类。有没有办法执行此用户doz

  • TL; DR 我想以一种从AbstractP的映射方式来使用ModelMapper,然后在ModelMapper-Config中为每个子类调用特定的映射器,然后跳过其余的(abstrac类)映射。 这怎么可能?这是正确的做法吗?是否存在设计缺陷? 我所拥有的: 母公司: 一个子实体: 另一个子实体: 然后我有父DTO类: 一个孩子DTO: 另一个DTO: 在我的例子中,我将从控制器获取DTO,并在