Tôi đang cố bắt đầu sử dụng scalaz trong dự án nâng của tôi. Vì mục đích đó, tôi viết lại một số mã để đáp ứng phong cách. Xem xét mã để đăng nhập vào một người dùng:Đang cố gắng hiểu đơn vị trạng thái vô hướng
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)
}
Vì vậy, điều này nên được viết lại bằng cách sử dụng một đơn vị trạng thái nào đó. Nhưng tôi không hiểu, làm thế nào. Cố gắng này:
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: dụ cập nhật, theo câu trả lời.
Bất kỳ hướng dẫn/giải thích tốt nào về các đơn vị trạng thái ở đại lượng, cho biết cách sử dụng gets
, put
, v.v ...?
Bạn đã xem câu hỏi/câu trả lời trước đó của tôi chưa? http://stackoverflow.com/questions/7734756/scalaz-state-monad-examples – huynhjl
Tôi không chắc điều này thực sự thực tế.Bạn không thể chỉ sử dụng một số đơn vị nhà nước và kỳ diệu loại bỏ tất cả 'var' trong mã của bạn. Để làm việc này, bạn phải có một số cách để thay đổi trạng thái mà các phương thức gọi lại của 'SHtml' của Lift không hỗ trợ. (Tôi nghĩ rằng toàn bộ khái niệm về Lift chính xác là bạn sử dụng các biến bị ẩn trong nhiều lần đóng.) Tôi rất vui khi được chứng minh là sai, và xem một ví dụ làm việc về điều này. – Debilski
Bạn nói đúng. Cảm ơn. – folone