5

我正在读这个,它说:

好吧,关键是箭头符号禁止了一些符号允许的计算。特别是所有“箭头动作”必须是“静态”已知的。

它解释了:

静态已知”意味着如果我们有几行箭头符号

> -- y <- action1 -< x

> -- z <- action2 -< y

那么表达式 action2 不能依赖于 x 或实际上绑定在箭头符号行左侧的任何东西。

据我了解,这种限制使箭头值得。

现在,我正在尝试学习 Opaleye,我注意到它使用箭头将事物组合在一起。

为什么 Opaleye 使用箭头?为什么箭头非常适合这项工作?使此限制有用的数据库/查询是什么?

4

2 回答 2

3

参数化的数据库查询看起来像箭头:

  • 每个都有一个输入和一个输出
  • 他们组成
  • 我们希望以不同于 Haskell 函数的方式对待它们

组合(.)(或(<<<))看起来像一个 SQL 子查询。 (&&&)看起来像一个 SQL 连接。

我相信“静态已知”的限制与您可以合理地翻译成 SQL 的东西有关。一旦您允许fmap//使用任意 Haskell 函数lmaprmap这是不可行的(至少没有 SQL 语言扩展和 GHC 编译器插件)。不过,我还没有弄清楚细节。

我不知道我们可以通过 Opaleye 实现手动管理多少翻译。

于 2018-05-09T15:31:13.390 回答
0

在查询语言中结合聚合和一元绑定时,变量范围存在困难。我从来没有想出一个特别令人满意的解释,但你可以看到我的历史 Reddit 帖子关系记录的(固定)问题以了解一些细节。

于 2018-05-12T16:29:21.347 回答