haskell - 使用 Esqueleto 进行外部连接

标签 haskell esqueleto

我对外部连接如何与 esqueleto 一起工作感到有点困惑。

我创建了以下查询(简化):

select $ from $ \(rep `LeftOuterJoin` event) -> do
          on (rep ^. RepAtomId  ==. event   ^. EventAtomId )
          where_ (rep ^. RepAtomId  ==. val aid)
          return $ (rep, event ^. EventSeconds)

据我所知,在 SQL 端,此查询将搜索可能具有关联事件的代表。如果它们没有关联的事件,则事件字段(如 EventSeconds)将为“空”。在 Haskell 方面,这些应该被翻译成 Maybe Seconds(好吧,整数,但你明白了)。

那么当我运行这个查询并且没有任何东西可以连接到我的代表关系时,实际发生了什么?如何解构元组以保留默认值?

目前,我有一些类似的东西:

case listToMaybe lrep of
  Just ( entityVal -> rep
       , unValue -> seconds
       ) -> do stuff

(请注意,我在这里打开了 ViewPatterns)。这种类型的检查。但是如果我使用 (?.) 和 (fromMaybe 360​​0) 它会失败。模式分析中的 unValue。

最佳答案

我能够通过在正确的位置添加“just”来解决这个问题:

select $ from $ \(rep `LeftOuterJoin` event) -> do
         on (just (rep ^. RepAtomId)  ==. event  ?. EventAtomId )
         where_ (rep ^. RepAtomId  ==. val aid)
         return $ (rep, event ?. EventSeconds)

case listToMaybe lrep of
  Just ( entityVal -> rep
       , (fromMaybe 3600) . unValue -> seconds
       ) -> do stuff

想法是(事件)确实有一个类似 Maybe 的类型(我不确定它的类型是什么,但我知道它有一个嵌入式 Maybe)。因此,当我与代表进行比较时,我是在将 (Maybe a) 与 a 进行比较。 “只是”将 a 包装成 a (Maybe a),而不必解构中间类型。

关于haskell - 使用 Esqueleto 进行外部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23967523/

相关文章:

dictionary - Haskell:在关联列表中插入或附加值

haskell - 试图找出 Haskell 中的 `random` 函数

sql - 使用 Esqueleto 处理列表类型

haskell - 在 Esqueleto 中获取聚合函数的结果

algorithm - Haskell 的快速排序——它到底是什么?

haskell - Haskell 中是否有与 Data.Char 中的 ord 函数相反的函数

linux - Ubuntu 14.04 arbtt-stats 索引大错误

haskell - 使用 Esqueleto 和 Template Haskell 动态构建 SQL 查询?

sql - 选择内的 Esqueleto 计数

haskell - 无法使用 Esqueleto 编写双左连接