Asansör projemde scalaz kullanmaya başladım. Bu amaçla, stili karşılamak için bazı kodları yeniden yazıyorum. Bir kullanıcı giriş için bir kod düşünün:Scalaz state monad'ı anlamaya çalışmak
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)
}
Yani, bu şekilde bir devlet monad kullanılarak yeniden yazılmalıdır. Ama sadece anlamıyorum, nasıl. bu çalışılıyor:
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: Güncelleme örnek, cevaplarına göre.
Scalaz'taki devlet monad'ları ile ilgili iyi dersler/açıklamalar, gets
, put
, vb.
Daha önceki sorularıma/cevabınıza bir göz attınız mı? http://stackoverflow.com/questions/7734756/scalaz-state-monad-examples – huynhjl
Bunun gerçekten pratik olduğundan emin değilim.Bazı eyalet monadlarını kullanamazsınız ve kodunuzdaki tüm varyasyonlardan sihirli bir şekilde kurtulamazsınız. Bunun çalışması için, Lift'in SHtml'inin geri çağırma yöntemlerinin desteklemediği durum değişikliklerini zincirlemenin bir yolu olmalıdır. (Bence Lift'in bütün konsepti, birçok kapanışta gizli değişkenleri kullanmanızdır.) Yine de yanlış olduğunu kanıtlamaktan mutluluk duyarım ve bunun çalışma örneğini görürsünüz. – Debilski
Haklısınız. Teşekkürler. – folone