Ваш код должен выглядеть следующим образом:
deleteItemR :: ItemId -> Handler Html
deleteItemR itemid = do
runDB $ get404 itemid
runDB $ delete itemid
setMessage . toHtml $ ("Item deleted" :: Text)
redirectUltDest ItemR
Во-первых, ваша функция подписи не может быть ItemID -> Html
, он должен быть выполнен в Handler
.
Вам также необходимо использовать нотацию do
для эмуляции последовательности действий в Haskell.
Обратите внимание, что любое действие в такой последовательности может привести к завершению выполнения. Например, runDB $ get404 itemid
попытается извлечь элемент, на который ссылается itemid
. Если он не существует, пользователь будет перенаправлен на страницу 404 (не найден), не пытаясь выполнить другие действия.
Нам нужно действие runDB $ get404 itemid
, потому что действие runDB $ delete itemid
не завершит последовательность, даже если элемент не существует. Поэтому он указывает, что элемент был удален, хотя его не было.