我正在使用Parallel类型类来收集所有验证错误:
def getNonEmptyStr[M[_]](key: String)(
implicit
E: MonadError[M, Errors],
A: ApplicativeAsk[M, Params],
W: FunctorTell[M, List[String]]
): M[String] = ???
def getInt[M[_]](key: String)(
implicit
E: MonadError[M, Errors],
A: ApplicativeAsk[M, Params],
W: FunctorTell[M, List[String]]
): M[Int] = ???
def getUser[M[_], F[_]](
implicit E: MonadError[M, Errors],
R: ApplicativeAsk[M, Params],
W: FunctorTell[M, List[String]],
P: Parallel[M, F]
): M[User] =
(getNonEmptyStr("name"), getInt("age"), getNonEmptyStr("address"))
.parMapN(User)
该getUser函数有两个类型参数:
M是我的单子变压器堆栈,F是一些对偶M但允许并行执行的应用程序。
然后我想用下面的单子变压器堆栈来调用它:
type Stack[A] = EitherT[WriterT[Reader[Params, ?], List[String], ?], Errors, A]
我需要指定M类型参数来告诉编译器我正在使用哪个堆栈。但是我还必须指定F参数:
getUser[Stack, Nested[WriterT[Reader[Params, ?], List[String], ?], Validated[Errors, ?], ?]].value.run.run(params)
这看起来很丑陋。有什么办法让编译器推断F?
完整代码在这里:https ://gist.github.com/vkorerev/21bdd7d57e81a0752972f4bb3f45398a