我想在我的電梯項目中開始使用斯卡拉茲。爲此,我重寫了一些代碼以符合風格。考慮登錄用戶的代碼:試圖瞭解斯卡拉茲狀態monad
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)
}
因此,這應該用某種狀態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 ! ""
UPD:更新例如,根據答案。
斯卡拉的狀態monads的任何好的教程/解釋,展示如何使用gets
,put
等?
你看過我早期的問題/答案嗎? http://stackoverflow.com/questions/7734756/scalaz-state-monad-examples – huynhjl
我不確定這是否真的很實用。你不能只使用一些狀態monad,並且魔法地去掉你的代碼中的所有'var's。爲了這個工作,你必須有一些方法來鏈接Lift的'SHtml'回調方法不支持的狀態變化。 (我認爲Lift的整個概念正是你使用隱藏在許多閉包中的變量)。然而,我很樂意被證明是錯誤的,並且看到了一個這樣的例子。 – Debilski
你說得對。謝謝。 – folone