fol*_*one 5 scala lift state-monad scalaz
我正试图在我的电梯项目中开始使用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)
}
Run Code Online (Sandbox Code Playgroud)
因此,应该以某种方式使用状态monad重写.但我只是不明白,怎么样.试试这个:
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 ! ""
Run Code Online (Sandbox Code Playgroud)
UPD:根据答案更新了示例.
状态单子在scalaz任何好的教程/解释,说明如何使用gets,put等等?
警告:我从未使用过 Scala 状态 monad。然而,我想我明白它的行为就像你说的那样的原因。
onSubmit看到旧的pass,而不是那个,我put在
好吧,看看你在做什么:
... { pass =>
... SHtml.password(pass, _ => put(pass))
... User.logIn("username", pass)
}
Run Code Online (Sandbox Code Playgroud)
首先,我不认为你在放你认为你在放的东西。试试这个:
... SHTML.password(pass, newPass => put(newPass))
Run Code Online (Sandbox Code Playgroud)
其次,我不认为你得到了你认为得到的东西。我不知道 Scalaz 状态 monad 是如何工作的,但它应该是这样的:
... User.logIn("username", get())
Run Code Online (Sandbox Code Playgroud)
我不认为你用来pass指变化的状态;pass只是开始时赋予状态计算的值,这可以解释为什么User.logIn("username", pass)使用“旧”oassword。
另外(虽然我不知道SHtml或是什么&)我非常怀疑这是否真的有效。很难解释为什么我这么认为,但SHtml正如 Debilski 评论的那样,这可能与在其内部构造状态表达式不友好有关。SHtml.password似乎期望你给它一个任意的副作用函数;这种设计选择立即使其对您尝试做的事情的功能方法不友好。
| 归档时间: |
|
| 查看次数: |
963 次 |
| 最近记录: |