我正在尝试在我的电梯项目中开始使用 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)
}
所以,这应该以某种方式使用状态单子重写。但我就是不明白,如何。试试这个:
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
等?