Ошибка типа "Yesod Hamlet" в цикле "все" сбивает с толку
У меня есть обработчик Yesod, который возвращает список типа [(Category, [Product])], я пытаюсь пройтись по циклу в моем шаблоне деревушки.
$if null rows
<p>No products
$else
<div class="list-group menu">
$forall (category, products) <- rows
<h4>#{categoryName category}
$forall product <- products
<p>#{productName product} - #{productPrice product}</p>
Когда я компилирую, я получаю сообщение об ошибке:
Handler/Menu.hs:11:7:
Couldn't match type ‘[(Category, [Product])]’
with ‘(Category, t0 Product)’
Expected type: ReaderT SqlBackend m1 (Category, t0 Product)
Actual type: ReaderT SqlBackend m1 [(Category, [Product])]
In the second argument of ‘Data.Foldable.mapM_’, namely ‘rows’
In a stmt of a 'do' block:
Data.Foldable.mapM_
(\ (category_aiv7, products_aiv8)
-> do { (asWidgetT GHC.Base.. toWidget)
((blaze-markup-0.7.0.3:Text.Blaze.Internal.preEscapedText
GHC.Base.. Data.Text.pack)
"<div class=\"list-group-item\"><h4 class=\"list-group-item-heading\">");
(asWidgetT GHC.Base.. toWidget)
(toHtml (categoryName category_aiv7));
.... })
rows
Я не понимаю, почему это ожидает и что я могу сделать, чтобы это работало. Большое спасибо.
Обновление: мой обработчик.
getMenuR :: Handler Html
getMenuR = do
let rows = query
defaultLayout $ do
$(widgetFile "menu")
query = do
cats <- selectList [] [Asc CategoryName]
forM cats $ \(Entity catId cat) -> do
products <- selectList
[ProductCategory ==. catId]
[Asc ProductName]
return (cat, map entityVal products)
1 ответ
Решение
После помощи от Майкла это так же просто, как заменить let rows = query
с rows <- runDB query