如何巧妙地在Scala中撰写通用特征?

时间:2017-09-29 17:33:04

标签: scala generics macros shapeless

想象一下许多通用服务,它们有不同的方法并返回一个monad或几个monad。这些服务可能由“粗略”服务组成,例如以下示例:

trait Service1[A,B,M[_]] {

  def get(a:A):Either[Throwable,M[B]]

  def delete(a:A):Either[Throwable,M[B]]


}

trait Query

trait Service2[A,B,M[_]] {

  def get(a:A):Either[Throwable,M[B]]

  def find(q:Query):Either[Throwable,M[B]]

}


trait Service3[A,B,M[_]] {

  def get(a:A):Either[Throwable,M[B]]

}

object Service{

  //type Aux[A,B,M[_],N[_],T[_]] = Service1[A,B,M] with Service2[A,B,N] with Service3[A,B,T]

  trait ServiceFull[A,B,M[_],N[_],T[_]] extends Service1[A,B,M] with Service2[A,B,N] with Service3[A,B,T]

}

如果您需要提供将服务转换为不同类型B的服务的语法,您可以在每个服务(或Monad实例)中编写一个方法,然后在较粗略的服务中编写一个方法。

使用更少的样板,例如使用无形或宏,可以实现相同的目标吗?

0 个答案:

没有答案