如何进行 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 中获取相应的列并将该值传递给函数。
我刚开始使用 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 中获取相应的列并将该值传递给函数。