如何进行 Beam 查询?

How to make Beam queries?

我刚开始使用 Haskell 和最近的 Beam。我以某种方式浏览了文档,但无法很好地理解它。

如何进行简单的查询?

我可以在文档中看到

filter_ 这样的函数将 lambda 函数作为输入参数。

来自文档

filter_ (\s -> addressCity (customerAddress s) ==. val_ (Just "Berlin")) $
all_ (customer chinookDb)

什么是 s? beam 库为我们提供的 lambda 函数提供了哪些值(和类型)? addressCity (customerAddress s) 整个是一列吗?我知道 customer 是 table 而 chinookDb 是数据库。

我比较感兴趣做求和查询。相当于

SELECT SUM(colname) FROM TABLE;

但是文档只给出了一个有点复杂的查询作为例子。

    aggregate_ (\(genre, track) ->
              ( group_ genre
              , as_ @Int $ countOver_ distinctInGroup_ (trackUnitPrice track)
              , fromMaybe_ 0 (sumOver_ allInGroupExplicitly_ (fromMaybe_ 0 (trackMilliseconds track))) `div_` 1000)) $ do
  g <- all_ (genre chinookDb)
  t <- genreTracks g
  pure (g, t)

我可以看出 sum_count_ 相似,但必须向它提供什么 lambda 函数?

我明白了。

如果您质疑什么 lambda 函数 可以 将其作为输入,它就很清楚了。

所以这个表达式:

aggregate_ (\x -> sum_ (hello x))其实是aggregate_ (\col -> sum_ (colT col))

其中 colT 是您在定义梁 Table 时定义的列。 lambda 函数中 colT 的存在足以让 Beam 从 table 中获取相应的列并将该值传递给函数。