问题标签 [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.
haskell - MaybeT m 的应用实例假设 Monad m
我一直在使用Haxl
monad(在这里描述:http ://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_slides_from_my_talk ),它有一个有趣的特性,<*>
它的 Applicative 实例与ap
Control不同。单子。这是一个关键特性,允许它在不阻塞的情况下进行并发计算。例如,如果hf
和ha
是长计算,那么
将按顺序进行,而
将并行执行它们,然后合并结果。
我希望能够在 中运行计算MaybeT Haxl
,但问题是MaybeT m
变压器包中的 Applicative 实例使用单子绑定:
ap = liftM2 id
来自哪里Control.Monad
。这使得
依次运行。似乎更好的实例更像
(这里,(<*>)
右侧是monad,而右侧Maybe
未加括号的是。)请注意,上下文是不同的——上面的实例只假设,而转换器中的实例假设。<*>
m
Applicative m
Functor m, Monad m
我的主要问题是实际的:我应该怎么做?我应该推出自己的MaybeT
单子变压器吗?如果我尝试编写上述内容,是否有某种方法可以解决 ghc 给我的“重复实例声明”投诉?
我还想知道:当前设置是变压器包中的设计缺陷吗?如果不是,为什么不呢?
scala - 如何使用 Applicative 进行并发?
假设我正在从博客服务器获取数据以呈现博客页面,该页面包含最近的帖子、热门帖子和帖子主题。
我有以下数据获取 API:
现在我需要组合它们来实现一个新功能getPageData
Haxl建议使用新的 monadFetch
来使 API 可组合。
现在我可以getPageData: Fetch[A]
用一元组合来定义我的
但它不会同时运行getRecent
、getPopular
和getTopics
。
Haxl建议使用应用组合<*>
来组合“并发”函数(即可以同时运行的函数)。所以我的问题是:
- 如何实现
getPageData
假设Fetch[A]
是一个Applicative
? - 如何实现
Fetch
为一个Applicative
而不是一个Monad
?
haskell - 将单态函数与多态 Haxl 库一起使用?
我正在使用 Haxl 库,并且正在尝试同时实现fetchHTML
:
我面临的问题是 HaxlBlockedFetch
是多态的:
然而我希望fetchHTML
是单态的(只返回一个 Int):
因此,当我尝试编译时出现以下错误:
最初我认为我可以重新定义BlockedFetch
为:
但是,这需要一个新的实现DataSource
,以使其能够接收我的自定义BlockFetch'
:
显然,这只会向后影响,需要我重新编写整个 Haxl 模块!
我的问题是:
1)有没有一种简单的方法来制作fetchHTML
多态?(我不太关心它返回什么,只是它完成后返回一些东西)
2) Haskell 程序员遇到此类问题时的一般方法是什么?
haskell - Haxl 中的代码重用 - 避免 GADT 每个请求类型的构造函数
Haxl 是一个了不起的库,但我发现的主要痛点之一是由于对数据源的每种请求都需要在 Request GADT 中使用自己的构造函数。例如,以教程中的示例为例:
然后,这些构造函数中的每一个都在 DataSource 实例的 match 函数中进行模式匹配和单独处理。这种风格会导致大量的样板文件用于非平凡的应用程序。以使用关系数据库的应用程序为例,其中每个表都有一个主键。可能有数百个表,所以我不想为每个表定义一个构造函数(更不用说跨表的所有可能连接......)。我真正想要的是:
我正在使用持久性从我的表中创建类型,但这不是关键细节——我只想对多个可能的返回类型使用单个构造函数。
尝试编写 fetch 函数时出现问题。使用 Haxl 的通常过程是在构造函数上进行模式匹配以分离出各种类型的 BlockedFetch 请求,在上面的示例中对应于如下内容:
...然后我会(以某种方式)按其键类型对参数进行分组,并为每个组发送一个 SQL 查询。但这种方法不会,因为这里可能是对多种PersistentEntity
类型(即数据库表)的请求,每个类型都是不同的类型a
,因此构建列表是不可能的。我曾考虑过使用存在量化类型来解决这个问题(类似于单例库中的 SomeSing),但是如果不对每个可能的表/类型进行模式匹配,我就无法根据需要对请求进行分组。
有没有办法实现这种代码重用?
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 约束。我不明白为什么会出现这个错误。