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

无形映射中的子类型多态性

冯飞鹏
2023-03-14

我构建了以下内容:

import shapeless._
import poly._

object Main {
    def main(args: Array[String]) = {

        object iterateOverHList extends (List ~> Iterator) {
            def apply[T](it: List[T]) = it.iterator
        }

        val x = List(1,2,3) :: List("cat","dog") :: HNil

        val xIt = x map iterateOverHList

    }
}

上面的代码非常好,非常棒。然而,我仍然想要更多。我希望允许任何Iterable,而不是指定我的HList将包含列表。这样地:

import shapeless._
import poly._

object Main {
    def main(args: Array[String]) = {

        object iterateOverHList extends (Iterable ~> Iterator) {
            def apply[T](it: Iterable[T]) = it.iterator
        }

        val x = List(1,2,3) :: List("cat","dog") :: HNil

        val xIt = x map iterateOverHList

    }
}

第二个版本无法编译,并显示消息“无法找到参数映射器的隐式值:shapeless.ops.hlist.mapper[iterateOverHList.type,shapeless:[List[Int],shapeless:[List[String],shapeless.HNil]]”。我在这里期望的子类型多态性,即在Iterable上工作的函数应该在List上工作,由于某种原因而失败。为什么?有没有办法让我绕过这个问题,还是我自己的贪婪会毁掉我?

共有1个答案

申屠喜
2023-03-14

<代码>~

object iterateOverHList extends Poly1 {
  implicit def iterable[T, L[T] <: Iterable[T]] = at[L[T]](_.iterator)
}

您还可以创建一个Poly1,它适用于某些可以被视为Iterable的类型,如下所示:

import scala.collection.generic.IsTraversableOnce
object iterateOverHList extends Poly1 {
  implicit def iterable[L](implicit i: IsTraversableOnce[L]) =
    at[L](i.conversion(_).toIterator)
}

val x = "abc" :: List(1,2,3) :: HNil
val xIt = x map iterateOverHList
// xIt: shapeless.::[Iterator[Char],shapeless.::[Iterator[Int],shapeless.HNil]] = non-empty iterator :: non-empty iterator :: HNil
 类似资料:
  • 我使用@JsonTypeInfo和@JsonSubTypes来映射基于给定属性的解析子类。下面是我想要解析的示例JSON的一个人为示例。 用这个作为课堂 但是,当JSON包含我想要忽略的类型时,就会出现问题。例如,如果我有一个新类型的“猪”,我真的不想反序列化为对象: 并尝试解析它,它会给我这个错误: 无法将类型id猪解析为[简单类型,类动物]的子类型 我如何修复它,这样我就可以只绘制那些“狗”和

  • 问题内容: 我的数据结构非常通用。几乎所有类型的数据都适合我的数据结构。 另一个文档可能是这样的: 该数据可以更改,并且字段可以具有任何类型和名称。如何动态创建模板映射,以便通过数据中“类型”的值来设置映射的“类型”?例如,值:34.50,类型:在同一时间浮动相同数据“值”:“哈利·波特”,类型:字符串 我已经知道ES中已经做到了这一点,但是我无法做出真正使用文档中指定的“ type”值来实际为该

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

  • 问题内容: 我正在使用Jackson1.9.x。坚持以动物为例,这是我想做的: 假设我有一个Animal类: 我希望能够执行以下操作(将一些子类型映射到一个类,将更多子类型映射到另一个类): 我现在看到的是,杰克逊只会识别“狗到哺乳动物”和“渡渡鸟到鸟”的映射。这是因为StdSubtypeResolver._collectAndResolve()仅允许同一类注册一次(由于NamedType.equ

  • 这是显示类型列表动态不是类型映射字符串动态的子类型“现在当我运行模拟器时,显示”类型列表动态不是类型映射字符串动态的子类型“在我的模拟器上,我如何修复它? 现在我想创建关于查找api id的程序,从我的模拟器中使用文本字段和按钮,当我把一些数字和单击按钮时,会显示该ID的数据或标题,但我只是初学者,所以如果有人认为我的代码是正确的或不正确的或者你有推荐请告诉我 My JSON JSON代码 应用程

  • 我对Flutter编程非常陌生,我正在尝试导入一个本地JSON文件,其中包含书籍数据,如标题、作者、发布年份等。 最初我使用JSON-to-DART转换器来组装一个图书数据模型,现在我正在尝试创建一个函数,在该函数中,程序获取本地JSON文件,并使用类中的方法将数据解析为地图。 我遇到的问题是返回类型