标签: haxl

MaybeT m的应用实例假设Monad m

我一直在使用Haxlmonad(在这里描述:http://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_slides_from_my_talk),它有一个有趣的特性,<*>因为它的Applicative实例ap与Control不同.单子.这是一个关键功能,允许它在不阻塞的情况下进行并发计算.例如,如果hfha是长计算,然后

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)

monads haskell monad-transformers applicative haxl

13
推荐指数
1
解决办法
441
查看次数

如何使用Applicative进行并发?

这是我上一个问题的后续行动.我从Haxl复制了下面的例子

假设我从博客服务器获取数据以呈现博客页面,其中包含最近的帖子,热门帖子和帖子主题.

我有以下数据提取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)

concurrency functional-programming scala applicative haxl

6
推荐指数
1
解决办法
325
查看次数

像Haxl和Stitch中的并发数据访问

这是我先前问题的跟进。

据我从HaxlStitch的了解,他们使用monad进行数据访问。monad实际上是一棵数据访问命令。子节点是节点依赖的命令。兄弟姐妹是同时执行的。

业务逻辑创建单子,然后由一个单独的函数对其进行fetch解释。

现在,问题是:假设我正在同时执行一些数据访问操作。我可以使用一个应用函子(不是monad),它只是命令列表(不是树)。

是否有意义 ?如果列表包含重复的命令怎么办?

monads concurrency scala applicative haxl

5
推荐指数
1
解决办法
584
查看次数