我的代码中经常出现以下用例:
并且我想获得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中是否存在这样的功能。
最佳答案
如果您知道类型,那将非常简单。第一次从A
到B
的隐式转换:
implicit def conversion(a: A): B = //...
那么您需要从
List[S]
到List[T]
的隐式转换,其中S
和T
是任意类型,存在从S
到T
的隐式转换: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)
其中
S
是A
和T
是B
。
关于scala - 如何使用隐式转换将List [A]转换为List [B],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14941794/