私はこれについて言及しています:
http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.data.Form
fold というメソッドを検索すると、フォームの処理に使用されるメソッドが表示されます。この方法がフォールドと呼ばれる理由はありますか? 折り畳みがすでにリストのようなオブジェクトに対して意味を持っていることを考えると、この名前は混乱を招きやすいようです。
私はこれについて言及しています:
http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.data.Form
fold というメソッドを検索すると、フォームの処理に使用されるメソッドが表示されます。この方法がフォールドと呼ばれる理由はありますか? 折り畳みがすでにリストのようなオブジェクトに対して意味を持っていることを考えると、この名前は混乱を招きやすいようです。
fold
onは、Scala 標準ライブラリのon theクラスにForm
非常に近く、同様に、成功 (この場合、結果を含む があります) または失敗 (この場合、エラーが含まれているか、入力が残っている可能性があります) 。というわけで、ここで例として使用します。必要に応じて、一種の絵として描いてください。fold
Either
Right
Left
Either
Form[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 つの形状 (Right
とLeft
) を持ち、どちらかの形状の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
これは明らかに非常に印象的で手の込んだものですが、さまざまな方法が基本的に同じ種類のものであることをより直感的に理解するのに役立つかもしれません. 詳細については、上記のコメントでリンクした質問、またはカタモルフィズムに関するウィキペディアのエントリを参照してください。
これは {play for scala} の説明です: Scala では、fold は、複数の可能な値を 1 つの値に折りたたむ (折りたたむ) メソッドの名前としてよく使用されます。この場合、検証エラーのあるフォームまたは正しく検証されたフォームを応答に折り畳もうとしています。