想象一下许多通用服务,它们有不同的方法并返回一个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实例)中编写一个方法,然后在较粗略的服务中编写一个方法。
使用更少的样板,例如使用无形或宏,可以实现相同的目标吗?