【发布时间】:2015-01-01 12:14:33
【问题描述】:
这是我之前的question 的后续。我从Haxl复制了下面的示例
假设我正在从博客服务器获取数据以呈现博客页面,其中包含最近的帖子、热门帖子和帖子主题。
我有以下数据获取 API:
val getRecent : Server => Seq[Post] = ...
val getPopular : Server => Seq[Post] = ...
val getTopics : Server => Seq[Topic] = ...
现在我需要组合它们来实现一个新功能getPageData
val getPageData: Server => (Seq[Post], Seq[Post], Seq[Topic])
Haxl 建议使用新的 monad Fetch 使 API 可组合。
val getRecent : Fetch[Seq[Posts]] = ...
val getPopular : Fetch[Seq[Posts]] = ...
val getTopics : Fetch[Seq[Topic]] = ...
现在我可以用 monadic 组合定义我的getPageData: Fetch[A]
val getPageData = for {
recent <- getRecent
popular <- getPopular
topics <- getTopics
} yield (recent, popular, topics)
但它不会同时运行 getRecent、getPopular 和 getTopics。
Haxl 建议使用 applicative 组合 <*> 组合“并发”函数(即可以同时运行的函数)。所以我的问题是:
- 假设
Fetch[A]是Applicative,如何实现getPageData? - 如何将
Fetch实现为Applicative而不是Monad?
【问题讨论】:
标签: scala concurrency functional-programming applicative haxl