Я играюсь с фреймворком Snap и часто сталкиваюсь со случаем, когда я выполняю поиск в базе данных на основе параметра, который я получаю из поля формы.
Рассмотрим, например. следующие две функции
getParam :: (MonadSnap m) => ByteString -> m (Maybe ByteString)
doLookup :: (MonadIO (m b v), MonadSnaplet m, MonadState s (m b b), HasAcid s UrlDB) => ByteString -> m b v (EventResult QueryByURL)
где UrlDB — это сопоставление между целыми числами и URL-адресами. Сложная сигнатура типа второй функции связана с использованием кислотного состояния и в конечном итоге приводит к Maybe Integer
.
queryByURL :: Text -> Query UrlDB (Maybe Integer)
Пока что мой обработчик выглядит так
indexHandler :: Handler MyApp MyApp ()
indexHandler = do
mUrl <- getParam "url"
case mUrl of
Nothing -> render "index"
Just url -> do
mId <- doLookup $ url
case mId of
Nothing -> render "index"
Just i -> do
fancyStuffWith i
render "index"
Итак, первое, что меня раздражает, — это ступенчатость падежных выражений. Во-вторых, это тройственное явление render "index"
. По сути, всякий раз, когда одно из двух значений Maybe равно Nothing, я хочу вернуть представление по умолчанию.
Каким будет самый чистый способ сделать это?