Scala方式构造操作代码和类型

时间:2017-08-31 13:40:14

标签: scala

我有以下操作:OpSUMOpAVGOpSTD,...我想为IntFloat,{ {1}}和其他类型。

蛮力方式可能是这样的:

String

有更好的scala方式吗?
我在这里看到的主要问题是Op和类型是耦合的,这意味着对于每个操作,类型执行不同的工作。

2 个答案:

答案 0 :(得分:2)

如果你尝试使用类型类(如他的评论中提出的@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 = ???
    }
  }

// ...

答案 1 :(得分:0)

我还链接了Daniel Westheide的this explanation of Type Classes,因为他在帖子中使用的应用程序域看起来与你的相似。