Estoy intentando comenzar a usar scalaz en mi proyecto de elevación. Para ese propósito estoy reescribiendo un código para cumplir con el estilo. Considere un código para iniciar sesión en un usuario:Intentando entender la mónada del estado de Scalaz
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)
}
Por lo tanto, esto se debe volver a escribir utilizando una mónada de estado de alguna manera. Pero simplemente no entiendo, cómo. Intentar esto:
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: ejemplo Actualizado, de acuerdo con las respuestas.
¿Algún buen tutorial/explicación sobre las mónadas estatales en scalaz, que muestra cómo usar gets
, put
, etc.?
¿Echa un vistazo a mi pregunta/respuesta anterior? http://stackoverflow.com/questions/7734756/scalaz-state-monad-examples – huynhjl
No estoy seguro de que esto sea realmente práctico.No puedes simplemente usar una mónada de estado y deshacerte mágicamente de todas las 'var's en tu código. Para que esto funcione, debe tener algunos medios para encadenar los cambios de estado que los métodos de devolución de llamada de 'SHtml' de Lift no admiten. (Creo que todo el concepto de Lift es precisamente que utilizas variables ocultas en muchos cierres). Sin embargo, me alegraría que se probara que estoy equivocado y ver un ejemplo práctico de esto. – Debilski
Tienes razón. Gracias. – folone