Пытаюсь понять scalaz state monad

Я пытаюсь начать использовать 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 и т.д.?

5
задан folone 16 December 2011 в 08:54
поделиться