Option内の値を使用して別のTryを作成する関数を使用して、[Option [A]]をflatMapしたい単純で慣用的である。私はその問題を例で説明しました。目標は、3つの機能のいずれかからのエラーを含むことができる単一のTryでラップされたメンバーとイベントでOption [Group]を作成することです。Try [Option]を慣用的にflatMapするには
def getGroup(id: Long): Try[Option[Group]]
def getMembersForGroup(groupId: Long): Try[Seq[Member]]
def getMeetingsForGroup(groupId: Long): Try[Seq[Meeting]]
私は「道で」オプションがありますので、試してみてくださいmember-、ミーティング-関数から試してみgetGroup
で返されるからflatMapにそれが困難見つけます。これは私がこれまでに出ているものです:私は私の解決策については好きではない何
getGroup(id).flatMap(
groupOpt => groupOpt.map(
group => addStuff(group).map(group => Some(group))
).getOrElse(Success(None))
)
def addStuff(g: Group): Try[Group] =
for {
members <- getMembersForGroup(g.id)
meetings <- getMeetingsForGroup(g.id)
} yield g.copy(members = members, meetings = meetings)
は私がgetOrElseを実行するには、オプションでaddStuff
によって返されたグループをラップしなければならないということです。この時点で、タイプは[Try [Option [Group]] [Option] [Try]となっています。
この問題の解決法は簡単ですか? addStuffコールからの潜在的な故障情報を無視しての費用であろうことが、
getGroup(id).map(
groupOpt => groupOpt.flatMap(
group => addStuff(group).toOption
)
)
:
はどのように3を組み合わせていますか?どのようなタイプですか?いくつかのResultTypeに '(Seq [Member]、Seq [Meeting]、Group)=> ResultType'関数があると仮定しますか? – stewSquared
私はfor-comprehensionによって得られたコピー関数を使用します。結果のタイプをTry [Option [Group]]にしたい。 –
この質問のタイトルを読んで、私はhttps://www.manning.com/books/functional-and-reactive-domain-modelingを読むことをお勧めします! –