5

リフトプロジェクトで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)
  }

したがって、これはどういうわけか状態モナドを使用して書き直す必要があります。しかし、私はどうやって得られないのですか。これを試してみてください:

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:回答によると、例を更新しました。

gets、、などの使用方法を示す、scalazの状態モナドに関する優れたチュートリアル/説明はありputますか?

4

2 に答える 2

2

私がこれまでに見つけた最高の語用論の例は次のとおりです。http ://etorreborre.blogspot.com/2011/06/essence-of-iterator-pattern.html?m = 1 http://etorreborre.blogspot.com/2011 / 12 / pragmatic-io.html?m=1そしてフォローアップ。scalazの例からのこの例: )https://github.com/scalaz/scalaz/blob/scalaz-seven/example/src/main/scala/scalaz/example/WordCount.scala

単語数の例では、3つの値を数え、単語数の値は状態を使用して計算されます。これがお役に立てば幸いです。

于 2011-12-13T14:15:55.943 に答える
2

警告:私はScalaステートモナドを使用したことがありません。しかし、私はあなたが言うようにそれが振る舞う理由を理解していると思います。

onSubmitpass古いものではなく、古いものputを見る

さて、あなたがしていることを見てください:

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

第一に、私はあなたがあなたが置いていると思うものを置いているとは思わない。代わりにこれを試してください:

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

第二に、私はあなたがあなたが得ていると思うものをあなたが得ているとは思わない。Scalaz状態のモナドがどのように機能するかはわかりませんが、のようになります。

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

pass私はあなたが変化する状態を参照するために使用するとは思わない。passは、最初に状態計算に与えられる値でありUser.logIn("username", pass)、「古い」オアソードを使用している理由を説明します。

また(私にはわかりませんがSHtml、何をするのかはわかりません&が)これが実際に機能するかどうかは非常に疑わしいです。なぜ私がこれを考えるのかを説明するのは難しいですがSHtml、Debilskiがコメントしたように、それはおそらくそれ自体の中に状態式を構築することに友好的ではないことと関係があります。あなたがそれに恣意的な副作用機能を与えることSHtml.password期待しているようです。この設計上の選択は、あなたがやろうとしていることに対する機能的なアプローチにすぐに不向きになります。

于 2011-12-13T23:55:48.607 に答える