У меня есть хобби веб-проект. Очень просто, просто чтобы изучить Haskell и веб-программирование. Для наглядности я использую Snap framework. И у меня есть следующий код (обработчик site.com/auth):
auth :: MonadSnap m => m ByteString
auth = withSession $ \s -> do
Just user <- getPostParam "user"
Just password <- getPostParam "password"
if user == "demi" && password == "1234"
then redirect "/"
else redirect "/login"
withSession
читает текущую сессию и запускает функцию в параметре. Здесь я столкнулся с проблемой: пользователь авторизуется, и я хочу установить новое значение для сеанса s
и запустить код с ним. Как лучше всего это сделать? Как вы это сделаете? Предположим, что код ниже также использует s
.
Еще вопрос: можно ли как-то сделать контекст прозрачным в обработчике (типа auth
) и других функциях? Я не хочу тянуть весь контекст (например, соединение с БД, сеанс и, возможно, другое) во всех функциях с параметром вроде ctx
:
findGoodies :: MonadSnap m => MyContext -> String -> m String
checkCaptcha :: MonadSnap m => MyContext -> m Bool
breakingNews :: MonadSnap m => MyContext -> m ByteString
В идеале я хочу иметь функцию withContext
, но контекст может измениться во время обработки запроса. Я думаю, что я могу решить это, определив свою монаду (правильно?), но я уже должен использовать Snap-монаду, и я не могу ее расширить (это тоже вопрос)?
Надеюсь, я говорю это довольно ясно, чтобы помочь мне.
withSession
читает текущий сеанс? Если экземплярMonadSnap
m
предоставляет доступ к сеансу, то все функции, возвращающие значение в монадеm
, также должны иметь доступ к сеансу теми же средствами. - person pat   schedule 11.05.2012