如何从仿函数到效果仿真到仿函数?

时间:2017-06-01 13:03:11

标签: scala scala-cats

我有两种不同类型的用户;我们称他们为BasicUserEnrichedUser

我在具有Foo实例的容器C中获得cats.Functor用户类型的值:

val basicUserF: C[BasicUser] = getBasicUser(…)

现在,我想映射此值(使用仿函数实例)将包含的BasicUser转换为EnrichedUser用户,并保留在容器中:

import cats.syntax.all._

val enrichedUserF: C[EnrichedUser] = basicUserF.map(user => enrichUser(user))

但是,enrichUser不会返回EnrichedUser,而是返回OptionT[Future, EnrichedUser],因此我最终会返回以下类型:

val enrichedUserThing: C[OptionT[Future, EnrichedUser]] = …

如何从这种类型转到OptionT[Future, C[EnrichedUser]](我最终会变成JSON序列化的Akka HTTP响应)?

1 个答案:

答案 0 :(得分:2)

如果您有Traverse[C]个实例,则可以使用sequence

scala> implicit def CTraverse: Traverse[C] = ???
CTraverse: cats.Traverse[C]

scala> def sequenced = enrichedUserThing.sequence[OptionT[Future,?], EnrichedUser]
sequenced: cats.data.OptionT[scala.concurrent.Future,C[EnrichedUser]]

额外:如果您启用了-Ypartial-unification,则不需要显式类型参数。