【发布时间】:2017-11-03 16:26:45
【问题描述】:
我不知道如何解决 scala 中的问题。也许有人可以帮助我!
我有一个带有一些类型参数的案例类(Operation),这个类可以由对参数类型一无所知的方法返回(例如来自string/json/xml的解析器) .
所以我需要一种方法以某种方式从ShadowedOperation 转换为Operation,因为需要从一些数据中解析ShadowedOperation 并从中提取类型化版本(Operation)。
我已经编写了一个应该表达问题的代码,它被简化并尝试做一些不同的事情,但是如果可以解决这个问题,我也可以解决真正的需求。
shapeless 可能有解决方案,但我需要找到没有它的解决方案。
object box {
trait Transform[A, B] {
def apply(in: A): B
}
object Transform {
def instance[A, B](f: A => B): Transform[A, B] = new Transform[A, B] {
override def apply(in: A): B = f(in)
}
}
implicit class TransformOps[T](w: T) {
def transform(implicit t: Transform[T, String]) = t(w)
}
trait ShadowedOperation {
type I
type O
def param: String
def otherParam: Int
def in: I
def out: O
}
object ShadowedOperation {
// How can i do this in a generic, typed and wonderful way ???
implicit def operationToString: Transform[ShadowedOperation, String] = ???
}
case class Operation[I0, O0](
param: String,
otherParam: Int,
in: I0,
out: O0
) extends ShadowedOperation {type I = I0; type O = O0}
object Operation {
implicit def operationToString[I, O](
implicit
iToString: Transform[I, String],
oToString: Transform[O, String]
): Transform[Operation[I, O], String] =
Transform.instance(in => s"${in.otherParam} - ${in.param} - ${iToString(in.in)} - ${oToString(in.out)}")
}
def fakeParseFromString(in: String): List[ShadowedOperation] = {
// this simulate a parsing (or read from db) from string to extract the case class
List(Operation("param", 0, "in!", "out!"), Operation("param", 0, "in!", 100))
}
}
object Main extends App {
import box._
implicit val intToString: Transform[Int, String] = Transform.instance(_.toString)
implicit val stringToString: Transform[String, String] = Transform.instance(_.toString)
val op = Operation("param", 0, "in!", "out!")
val shadowedOperationList = fakeParseFromString("imagine that this string contain a json")
val opString = op.transform
val shadowedOpString = shadowedOperationList.map(_.transform)
println(opString)
println(shadowedOpString)
}
提前感谢所有可以提供帮助的人!
【问题讨论】:
标签: scala implicit-conversion typeclass