Рассмотрим следующий код:
S.get "/budget/:bid/month/:mnth" $ do
mbid <- param "bid"
(budget :: Maybe Budget) <- liftIO $ getBudget $ toSqlKey mbid
(categories :: [Entity Category]) <- liftIO $ getCategories $ toSqlKey mbid
case budget of
Nothing -> json $ object [ "message" .= ("No budget was found!" :: String) ]
Just b -> do
json $ object [
"categoryExpenditures" .= map (\x -> object ["spent" .= liftIO $
calculateCategoryBalanceForMonth (entityKey x) 1 >>= (\y -> y) ]) categories
]
До этого момента calculateCategoryBalanceForMonth
имел тип calculateCategoryBalanceForMonth :: CategoryId -> Int -> IO Double
.
Я пытаюсь сопоставить categories
и вернуть список categoryExpenditures
в виде объекта JSON в Aeson. Однако я не могу понять, как вернуть значение из liftIO
в оператор .=
.
Моя попытка заключалась в понижении сахара оператора присваивания до >>= (\y -> y)
или >>= id
, где я надеялся, что id
вернет Double или, по крайней мере, что-то, что имело экземпляр ToJSON
. Однако, похоже, это не так.
Я также знаю, что использование оператора присваивания для выражения liftIO
, а затем передача назначенной переменной в оператор .=
работает, однако я не знал, как использовать оператор присваивания в анонимной функции для карты.
Что я могу делать неправильно? Нужна ли еще какая-то ясность?