Как перебирать значения при проверке

#haskell #ihp

Вопрос:

У меня есть простая служба ожидания, которую я хотел бы создать:

  1. Каждый товар может иметь несколько ставок.
  2. Каждая заявка содержит ссылку на Товар и price поле Int.

Когда создается новая ставка, я хотел бы убедиться, что ее цена выше, чем у существующих.

     action CreateBidAction = do
        let bid = newRecord @Bid
        bid
            |> buildBid
            |> validateIsPriceAboveOtherBids
            >>= ifValid case
            -- ...
 
 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

Я получаю сообщение об ошибке:

 Couldn't match type `[a0]' with `QueryBuilder "bids"'
 

Мои вопросы таковы:

  1. Как установить значение по умолчанию 0 gethighestBidPrice , если ставки пусты.
  2. Как найти самую высокую цену из предложенных.

Ответ №1:

Кажется, я пропустил fetch » а » из-за get #bids item этого .

Вот как я это решил:

 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