我想在我的Lift项目中开始使用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 ! ""
更新:根据回答更新了示例。
有哪些关于使用ScalaZ中状态单子的好的教程/解释,展示如何使用gets
,put
等方法?
var
。为了使其工作,您必须有一些链接状态更改的方法,而Lift的SHtml
回调方法不支持此功能。(我认为Lift的整个概念正是您在许多闭包中隐藏变量。)尽管如此,如果能看到一个可行的示例,我会很高兴被证明是错误的。 - Debilski