为什么数据库查询是使用Arrows的好地方?

时间:2018-05-09 13:59:23

标签: haskell arrows opaleye

我正在阅读this,其中说:

  

嗯,重点是箭头符号禁止表示符号允许的一些计算。特别是所有“箭头动作”必须“静态地”知道“。

它解释说:

  

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

     

currentLineNode.physicsBody = SKPhysicsBody(rectangleOf: currentLineNode.frame.size, center: CGPoint(x: startPoint.x + currentLineNode.frame.size.width / 2, y: startPoint.y + currentLineNode.frame.size.height / 2))

     

> -- y <- action1 -< x

     

然后表达式action2不能依赖于x或箭头符号行左侧绑定的任何东西。

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

现在,我正在努力学习Opaleye,我注意到它使用箭头将各种东西组合在一起。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

我相信&#34;静态知道&#34;限制涉及您可能合理地转换为SQL的内容。允许fmap / lmap / rmap使用任意Haskell函数后,这是不可行的(至少没有SQL语言扩展和GHC编译器插件)。不过,我还没有弄清楚细节。

我不知道Opaleye手工管理的翻译有多少。

答案 1 :(得分:0)

在查询语言中组合聚合和monadic绑定时,变量范围存在困难。我从来没有想出过一个特别令人满意的解释,但你可以看到a historical Reddit post of mine(fixed) issue with relational-record来了解一些细节。