scala - 如何使用隐式转换将List [A]转换为List [B]

标签 scala scalaz

我的代码中经常出现以下用例:

  • 一个集合[A]
  • 从A到B的隐式转换

  • 并且我想获得B的集合。我可以像下面这样隐式使用:
      case class Items(underlying:List[B])
      import B._
      def apply(a:List[A]):Items = {
        val listOfB= a.map {implicitly[A=>B]}
        Items(listOfB)
      }
    

    在Scala中做到这一点的最优雅的方法是什么,也许是在Scalaz的帮助下?

    编辑:我的问题的目的是找到一种惯用的方法,这是图书馆/开发人员之间的通用方法。从某种意义上说,我不喜欢开发自己的“pimp-my-library”解决方案,因为其他编写我的代码的人将不知道这种转换的存在并且不会使用它,并且他们将重写自己的转换。我赞成对这种常见功能使用库方法,这就是为什么我想知道在Scalaz中是否存在这样的功能。

    最佳答案

    如果您知道类型,那将非常简单。第一次从AB的隐式转换:

    implicit def conversion(a: A): B = //...
    

    那么您需要从List[S]List[T]的隐式转换,其中ST是任意类型,存在从ST的隐式转换:
    implicit def convList[S, T](input: List[S])(implicit c: S => T): List[T] = 
       input map c
    

    然后,这应该工作:
    val listOfA: List[A] = //...
    val listOfB: List[B] = listOfA
    

    编译器将其解析为:
    val listOfB: List[B] = convList(listOfA)(conversion)
    

    其中SATB

    关于scala - 如何使用隐式转换将List [A]转换为List [B],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14941794/

    相关文章:

    scala - 类型中的尾随逗号

    java - 如何使用 Scala 的 GraphStream 库

    scala - 使用 Future[Validation[E,A]] 进行理解

    scala - scalaz.Maybe 的 Circe 解码器

    Scalaz Kleisli 使用优势

    scala - 如何帮助 Scalaz 进行类型推断和 2 个类型参数

    scala - 如何分析 Akka 应用程序?

    java - 在 scala 中将时间戳解析为我想要的格式

    mysql - 我可以使用 anorm 调用返回两个行集的 MySQL 存储过程吗?

    scala - 解释 scalaz-7 中的 Traverse[List] 实现