我有两种不同类型的用户;我们称他们为BasicUser
和EnrichedUser
。
我在具有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响应)?
答案 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
,则不需要显式类型参数。