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

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

发布时间:2020-12-16 09:49:30 所属栏目:安全 来源:网络整理
导读:我构建了以下内容: 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") :: HNi
我构建了以下内容:

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

    }
}

上面的代码很棒,非常棒.但是,我还想要更多.我想,而不是指定我的HList将包含列表,允许任何Iterable.像这样:

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,"dog") :: HNil

        val xIt = x map iterateOverHList

    }
}

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

解决方法

?>适用于确切类型.如果你想要一个Poly1用于Iterable的任何子类型,你应该像这样创建它:

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,3) :: HNil
val xIt = x map iterateOverHList
// xIt: shapeless.::[Iterator[Char],shapeless.::[Iterator[Int],shapeless.HNil]] = non-empty iterator :: non-empty iterator :: HNil

(编辑:李大同)

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

    推荐文章
      热点阅读