首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在验证时迭代值

如何在验证时迭代值
EN

Stack Overflow用户
提问于 2021-09-25 22:16:35
回答 1查看 49关注 0票数 0

我想建立一个简单的招投标服务:

  1. 每个项目可以有多个出价。
  2. 每个出价都有一个对项目的引用和一个Int price字段。

当一个新的出价被创建,我想验证它的价格高于现有的价格。

代码语言:javascript
复制
    action CreateBidAction = do
        let bid = newRecord @Bid
        bid
            |> buildBid
            |> validateIsPriceAboveOtherBids
            >>= ifValid \case
            -- ...
代码语言:javascript
复制
validateIsPriceAboveOtherBids bid = do
    item <- fetch (get #itemId bid)
    let highestBidPrice = gethighestBidPrice (get #bids item)
    bid
        |> validateField #price (isGreaterThan highestBidPrice)
        |> pure


gethighestBidPrice bids = 42

如果我试图将bids视为列表:gethighestBidPrice [] = 0

我收到一个错误:

代码语言:javascript
复制
Couldn't match type `[a0]' with `QueryBuilder "bids"'

我的问题是:

如果出价为空,

  1. 如何在gethighestBidPrice上将默认值设置为0。
  2. 如何在投标中找到最高价格。
EN

回答 1

Stack Overflow用户

发布于 2021-09-27 13:07:33

我好像错过了fetchget #bids item

我就是这样解决的:

代码语言:javascript
复制
validateIsPriceAboveOtherBids bid = do
    item <- fetch (get #itemId bid)
    bids <- fetch (get #bids item)

    let prices = map (get #price) bids
    let highestBidPrice = maximum' prices
    bid
        |> validateField #price (isGreaterThan highestBidPrice)
        |> pure
    where
        maximum' :: [Int] -> Int
        maximum' [] = 0
        maximum' xs = foldr1 (\x y ->if x >= y then x else y) xs
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69330430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档