问题标签 [haxl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
530 浏览

haskell - MaybeT m 的应用实例假设 Monad m

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

将按顺序进行,而

将并行执行它们,然后合并结果。

我希望能够在 中运行计算MaybeT Haxl,但问题是MaybeT m变压器包中的 Applicative 实例使用单子绑定:

ap = liftM2 id来自哪里Control.Monad。这使得

依次运行。似乎更好的实例更像

(这里,(<*>)右侧是monad,而右侧Maybe未加括号的是。)请注意,上下文是不同的——上面的实例只假设,而转换器中的实例假设。<*>mApplicative mFunctor m, Monad m

我的主要问题是实际的:我应该怎么做?我应该推出自己的MaybeT单子变压器吗?如果我尝试编写上述内容,是否有某种方法可以解决 ghc 给我的“重复实例声明”投诉?

我还想知道:当前设置是变压器包中的设计缺陷吗?如果不是,为什么不呢?

0 投票
1 回答
655 浏览

scala - Haxl 和 Stitch 中的并发数据访问

这是我之前的问题的后续。

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

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

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

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

0 投票
1 回答
426 浏览

scala - 如何使用 Applicative 进行并发?

这是我之前的问题的后续。我从Haxl复制了下面的示例

假设我正在从博客服务器获取数据以呈现博客页面,该页面包含最近的帖子、热门帖子和帖子主题。

我有以下数据获取 API:

现在我需要组合它们来实现一个新功能getPageData

Haxl建议使用新的 monadFetch来使 API 可组合。

现在我可以getPageData: Fetch[A]一元组合来定义我的

但它不会同时运行getRecentgetPopulargetTopics

Haxl建议使用应用组合<*>来组合“并发”函数(即可以同时运行的函数)。所以我的问题是:

  • 如何实现getPageData假设Fetch[A]是一个Applicative
  • 如何实现Fetch为一个Applicative而不是一个Monad
0 投票
1 回答
82 浏览

haskell - 将单态函数与多态 Haxl 库一起使用?

我正在使用 Haxl 库,并且正在尝试同时实现fetchHTML

我面临的问题是 HaxlBlockedFetch是多态的:

然而我希望fetchHTML是单态的(只返回一个 Int):

因此,当我尝试编译时出现以下错误:

最初我认为我可以重新定义BlockedFetch为:

但是,这需要一个新的实现DataSource,以使其能够接收我的自定义BlockFetch'

显然,这只会向后影响,需要我重新编写整个 Haxl 模块!

我的问题是:

1)有没有一种简单的方法来制作fetchHTML多态?(我不太关心它返回什么,只是它完成后返回一些东西

2) Haskell 程序员遇到此类问题时的一般方法是什么?

0 投票
1 回答
126 浏览

haskell - Haxl 中的代码重用 - 避免 GADT 每个请求类型的构造函数

Haxl 是一个了不起的库,但我发现的主要痛点之一是由于对数据源的每种请求都需要在 Request GADT 中使用自己的构造函数。例如,以教程中的示例为例:

然后,这些构造函数中的每一个都在 DataSource 实例的 match 函数中进行模式匹配和单独处理。这种风格会导致大量的样板文件用于非平凡的应用程序。以使用关系数据库的应用程序为例,其中每个表都有一个主键。可能有数百个表,所以我不想为每个表定义一个构造函数(更不用说跨表的所有可能连接......)。我真正想要的是:

我正在使用持久性从我的表中创建类型,但这不是关键细节——我只想对多个可能的返回类型使用单个构造函数。

尝试编写 fetch 函数时出现问题。使用 Haxl 的通常过程是在构造函数上进行模式匹配以分离出各种类型的 BlockedFetch 请求,在上面的示例中对应于如下内容:

...然后我会(以某种方式)按其键类型对参数进行分组,并为每个组发送一个 SQL 查询。但这种方法不会,因为这里可能是对多种PersistentEntity类型(即数据库表)的请求,每个类型都是不同的类型a,因此构建列表是不可能的。我曾考虑过使用存在量化类型来解决这个问题(类似于单例库中的 SomeSing),但是如果不对每个可能的表/类型进行模式匹配,我就无法根据需要对请求进行分组。

有没有办法实现这种代码重用?

0 投票
1 回答
91 浏览

haskell - 仅知道类型类的存在类型中的值

为了减少将 Haxl 与关系数据库一起使用所需的样板文件的目标,我试图通过 Persistent 将原始 SQL 请求的结果打包为存在量化类型。但是类型检查器不允许它:

这会导致 fmap 出现类型错误:Ambiguous type variable ‘b0’ arising from a use of ‘SomeRawSql’ prevents the constraint ‘(RawSql b0)’ from being solved.

持久化 rawSql 的类型是:

runDB是一个辅助函数,它连接到数据库并返回IO [a]. 根据 rawSql 的定义,我希望能满足 RawSql 约束。我不明白为什么会出现这个错误。