Я пытаюсь начать использовать scalaz в своем проекте lift. Для этого я переписываю некоторый код, чтобы он соответствовал стилю. Рассмотрим код для входа пользователя в систему:
def login: CssSel = {
var password = ""
def submit() {
if (doLogin) S.redirectTo("/index")
else S.error("Wrong password")
}
"name=pwd" #> SHtml.password(password, password = _) &
"type=submit" #> SHtml.onSubmitUnit(submit)
}
Итак, это должно быть как-то переписано с использованием монады состояния. Но я просто не понимаю, как. Пробую так:
val result = for {
s <- init[String]
pass <- SHtml.password(s, put(_))
newPass <- init[String]
res <- "name=pwd" #> pass &
"type=submit" #> SHtml.onSubmit { _ =>
if (User.logIn("username", newPass)) S.redirectTo("/index")
else S.error("Wrong password")
}
} yield (newPass, res)
result ! ""
UPD: Обновил пример, согласно ответам.
Есть хорошие учебники/объяснения по монадам состояний в scalaz, показывающие, как использовать gets
, put
и т.д.?