我一直在使用Haxlmonad(在这里描述:http://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_slides_from_my_talk),它有一个有趣的特性,<*>因为它的Applicative实例ap与Control不同.单子.这是一个关键功能,允许它在不阻塞的情况下进行并发计算.例如,如果hf和ha是长计算,然后
let hf :: Haxl (a -> b) = ...
ha :: Haxl a = ...
in do
f <- hf
a <- ha
return (f a)
Run Code Online (Sandbox Code Playgroud)
将按顺序执行它们
hf <*> ha
Run Code Online (Sandbox Code Playgroud)
将并行完成它们然后结合结果.
我希望能够运行计算MaybeT Haxl,但问题是MaybeT m变换器包中的Applicative实例使用monadic绑定:
instance (Functor m, Monad m) => Applicative (MaybeT m) where
pure = return
(<*>) = ap
Run Code Online (Sandbox Code Playgroud)
ap = liftM2 id来自哪里Control.Monad.这使得
let hmf :: MaybeT …Run Code Online (Sandbox Code Playgroud) 假设我从博客服务器获取数据以呈现博客页面,其中包含最近的帖子,热门帖子和帖子主题.
我有以下数据提取API:
val getRecent : Server => Seq[Post] = ...
val getPopular : Server => Seq[Post] = ...
val getTopics : Server => Seq[Topic] = ...
Run Code Online (Sandbox Code Playgroud)
现在我需要编写它们来实现一个新功能 getPageData
val getPageData: Server => (Seq[Post], Seq[Post], Seq[Topic])
Run Code Online (Sandbox Code Playgroud)
Haxl建议使用新的monad Fetch来使API可组合.
val getRecent : Fetch[Seq[Posts]] = ...
val getPopular : Fetch[Seq[Posts]] = ...
val getTopics : Fetch[Seq[Topic]] = ...
Run Code Online (Sandbox Code Playgroud)
现在我可以getPageData: Fetch[A]用monadic组合来定义我
val getPageData = for {
recent <- getRecent
popular <- getPopular
topics …Run Code Online (Sandbox Code Playgroud)