2017-06-01 61 views
2

我有兩種不同類型的用戶;我們稱它們爲BasicUserEnrichedUser如何從一個函子去一個效果到一個函子的效果?

我得到具有cats.Functor實例的容器CFoo用戶類型的值:

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

現在,我想映射在這個值(使用仿函數實例)打開包含BasicUserEnrichedUser用戶,留在容器:

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序列化阿卡HTTP響應)得到什麼?

+0

死了這個幫助https://stackoverflow.com/questions/20874186/scala-listfuture-to-futurelist-disregarding-failed-futures? –

+0

@ n.m。我不確定。我看不出Future.sequence如何幫助我...... – lunaryorn

+2

如果你在'C'上加了一個'Traverse'約束,你可以使用'sequence'來完成你想要的。 –

回答

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使您無需顯式類型參數。

+0

好吧,所以我需要咬緊牙關並向C中添加一個Traverse實例:謝謝 :) – lunaryorn

相關問題