#haskell #ihp
Вопрос:
У меня есть простая служба ожидания, которую я хотел бы создать:
- Каждый товар может иметь несколько ставок.
- Каждая заявка содержит ссылку на Товар и
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"'
Мои вопросы таковы:
- Как установить значение по умолчанию 0
gethighestBidPrice
, если ставки пусты. - Как найти самую высокую цену из предложенных.
Ответ №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