6

私はこれについて言及しています:

http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.data.Form

fold というメソッドを検索すると、フォームの処理に使用されるメソッドが表示されます。この方法がフォールドと呼ばれる理由はありますか? 折り畳みがすでにリストのようなオブジェクトに対して意味を持っていることを考えると、この名前は混乱を招きやすいようです。

4

2 に答える 2

10

foldonは、Scala 標準ライブラリのon theクラスにForm非常に近く、同様に、成功 (この場合、結果を含む があります) または失敗 (この場合、エラーが含まれているか、入力が残っている可能性があります) 。というわけで、ここで例として使用します。必要に応じて、一種の絵として描いてください。foldEitherRightLeftEitherForm[T]Either[Form[T], T]

コレクションを折りたたむ

(非常に非公式に) リストはさまざまな「形状」 (空のリスト、長さ 1 のリスト、長さ 2 のリストなど) を持ち、fold(またはfoldLeft、次の例では) の任意のリストを折りたたむメソッドとして想像できます。形状に関係なく、単一の種類のものに対する適切な型:

scala> def catInts(xs: List[Int]): String = xs.foldLeft("")(_ + _.toString)
catInts: (xs: List[Int])String

scala> catInts(List(1, 2, 3, 4))
res0: String = 1234

scala> catInts(Nil)
res1: String = ""

いずれか/フォームで折ります

Either同様に、2 つの形状 (RightLeft) を持ち、どちらかの形状のfoldを取り、Either単一の種類のものを返すメソッドとして想像できます。文字列を整数として解析し、 を返す次のメソッドがあるとしますEither

def parseInt(s: String): Either[String, Int] =
  try Right(s.toInt) catch {
    case _: NumberFormatException => Left(s)
  }

そして、foldを折りたたむために使用する次のメソッドEither

def toDefault(e: Either[String, Int]): Int = e.fold(_ => 42, identity)

次のように使用できます。

scala> toDefault(parseInt("AAARGH!!"))
res2: Int = 42

scala> toDefault(parseInt("123"))
res3: Int = 123

foldこれは明らかに非常に印象的で手の込んだものですが、さまざまな方法が基本的に同じ種類のものであることをより直感的に理解するのに役立つかもしれません. 詳細については、上記のコメントでリンクした質問、またはカタモルフィズムに関するウィキペディアのエントリを参照してください。

于 2012-06-29T21:30:15.093 に答える
-2

これは {play for scala} の説明です: Scala では、fold は、複数の可能な値を 1 つの値に折りたたむ (折りたたむ) メソッドの名前としてよく使用されます。この場合、検証エラーのあるフォームまたは正しく検証されたフォームを応答に折り畳もうとしています。

于 2014-07-19T10:14:09.957 に答える