2017-06-01 15 views
2

私は2種類のユーザーを持っています。それらをBasicUserEnrichedUserと呼びましょう。ファンクション上のファンクタからファンクタ上のエフェクトに移動するにはどうすればよいですか?

私はcats.Functorインスタンスを持っているコンテナC内部Fooユーザタイプの値を取得:今、私は含まをオンにする(ファンクタのインスタンスを使用して)この値の上にマッピングしたいと思います

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

をコンテナに滞在EnrichedUserユーザーへBasicUser、:

import cats.syntax.all._ 

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

しかし、enrichUserEnrichedUserを返しませんが、ラット彼女OptionT[Future, EnrichedUser]ので、私は次のタイプで終わる:

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

私は(私が最終的にJSONシリアライズアッカのHTTPレスポンスに変わります)OptionT[Future, C[EnrichedUser]]にこのタイプから取得できますか?

+0

このヘルプは壊れています。https://stackoverflow.com/questions/20874186/scala-listfuture-to-futurelist-disregarding-failed-futures? –

+0

@ n.m。よく分かりません。 Future.sequenceが私にどのように役立つのか分かりません... – lunaryorn

+2

'Traverse'制約を' C'に追加すると、 '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

さて、弾を噛んでTraverseのインスタンスをCに追加する必要があります。ありがとう:) – lunaryorn

関連する問題