加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

试图了解scalaz state monad

发布时间:2020-12-16 18:37:48 所属栏目:安全 来源:网络整理
导读:我正试图在我的电梯项目中开始使用 scalaz.为此,我正在重写一些代码来满足风格.考虑用于登录用户的代码: def login: CssSel = { var password = "" def submit() { if (doLogin) S.redirectTo("/index") else S.error("Wrong password") } "name=pwd" # SHt
我正试图在我的电梯项目中开始使用 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)
  }

因此,应该以某种方式使用状态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:根据答案更新了示例.

有关scalaz状态monad的任何好的教程/解释,显示如何使用gets,put等?

解决方法

警告:我从未使用过Scala状态monad.但是,我认为我看到它的行为就像你说的那样.

onSubmit sees the old pass,not the one,I’m put‘ting

好吧,看看你在做什么:

... { pass =>
  ... SHtml.password(pass,_ => put(pass))
  ... User.logIn("username",pass)
}

首先,我认为你没有把你认为自己所投入的东西放在首位.试试这个:

... SHTML.password(pass,newPass => put(newPass))

其次,我认为你没有得到你认为你得到的东西.我不知道Scalaz状态monad是如何工作的,但它应该是这样的:

... User.logIn("username",get())

我不认为你用pass来指代变化的状态; pass只是给状态计算开始的值,这可以解释为什么User.logIn(“username”,pass)使用“旧”oassword.

此外(虽然我不知道SHtml或什么&做)我非常怀疑这将实际工作.很难解释为什么我认为这个,但它与SHtml有关,可能与内部构建状态表达式不友好,正如Debilski评论的那样. SHtml.password似乎希望你给它一个任意的副作用函数;这种设计选择会立即使您对尝试的功能方法不友好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读