Scala构建操作和类型代码的方法



我有以下操作: OpSUMOpAVGOpSTD,...我想为 IntFloatString和其他类型实现。

蛮力的方式可能是这样的:

trait Operation
case class OpSUM[T: TypeTag]() extends Operation {
    typeOf[T] match {
        case t if t =:= typeOf[String] => Do some string work
        case t if t <:< typeOf[Int] => Do some Int work
        ...
    }
}
case class OpAVG[T: TypeTag]() extends Operation {
    typeOf[T] match {
        case t if t =:= typeOf[String] => Do some string work
        case t if t <:< typeOf[Int] => Do some Int work
        ...
    }
}
...    

有更好的Scala方法可以做到这一点吗?
我在这里看到的主要问题是OP和类型是耦合的,这意味着每个操作类型都可以做不同的工作。

如果您尝试使用类型类方法(如他的评论中提出的@mrmcgreg),则可以看起来像:

  trait OpSUM[T] {
    def doSomeWork
  }
  object OpSUM {
    implicit val stringCase: OpSUM[String] = new OpSUM[String] {
      override def doSomeWork = ???
    }
    implicit def intCase[T <: Int]: OpSUM[T] = new OpSUM[T] {
      override def doSomeWork = ???
    }
  }
  trait OpAVG[T] {
    def doSomeOtherWork
  }
  object OpAVG {
    implicit val stringCase: OpAVG[String] = new OpAVG[String] {
      override def doSomeOtherWork = ???
    }
    implicit def intCase[T <: Int]: OpAVG[T] = new OpAVG[T] {
      override def doSomeOtherWork = ???
    }
  }
// ...

i也链接了丹尼尔·韦斯特海德(Daniel Westheide)对类型类的解释,因为他在其帖子中使用的应用域看起来与您的帖子相似。

最新更新