2016-11-27 11 views
4

私は関数型プログラミングとScalaを学びたいので、ChiusanoとBjarnasonの "Functional Programming in Scala"を読んでいます。私は何の折り目が左のリストと折りたたみの正しいメソッドがリストの場合に行うのか理解するのに困っている。私はここを見回しましたが、私は何か初心者フレンドリーではありません。だから、この本が提供するコードは次のとおりです。短所と無記号があるScala fold rightとfold left

def foldRight[A,B](as: List[A], z: B)(f: (A, B) => B): B = as match { 
    case Nil => z 
    case Cons(h, t) => f(h, foldRight(t, z)(f)) 
} 

def foldLeft[A,B](l: List[A], z: B)(f: (B, A) => B): B = l match { 
    case Nil => z 
    case Cons(h,t) => foldLeft(t, f(z,h))(f) 
} 

は:

ので
case class Cons[+A](head: A, tail: List[A]) extends List[A] 
case object Nil extends List[Nothing] 

実際に左と右の倍何をしますか?なぜ "ユーティリティ"メソッドとして必要なのでしょうか?それを使う方法はほかにもたくさんありますが、私はそれらを理解していないので、理解するのも難しいです。

+0

次のスレッドを見てください。 http://stackoverflow.com/questions/24370549/foldleft-v-foldright-does-it-matterこれらの操作に関する多くの情報があります。私に重複しているように見えます。 – Pavel

+0

その質問では、ユーザーが手元にある問題をかなりよく理解しているように聞いているようですが、私は助けたいものです。 – jrsall92

+2

あなたが提供したコード。具体的な質問はありますか?正確に何が難しいのですか?構文?この違いを理解するための鍵は、どちらの場合でも再帰呼び出しを行う方法です。違います。テール再帰について読む。これが役立つことを願っています。その他のリンク:https://oldfashionedsoftware.com/2009/07/10/scala-code-review-foldleft-and-foldright/ – Pavel

答えて

7

List(1, 3, 8).foldLeft(100)(_ - _) == ((100 - 1) - 3) - 8 == 88 
List(1, 3, 8).foldRight(100)(_ - _) == 1 - (3 - (8 - 100)) == -94 

あなたが見ることができるように、​​はちょうどリストの要素を渡します2番目の括弧内の操作への前回の適用の結果です。 これらのメソッドを同じリストに適用すると、適用された操作が結合的である場合にのみ、等しい結果が返されることにも言及する必要があります。

+0

私はあなたの操作が '(_ _)'であると思っています、それはプラスの代わりにマイナスです。さもなければ、foldLeftとfoldRightの違いについての非常に良い説明。 – melston

1

数字のリストがあり、それらをすべて追加したいとします。あなたはどうしますか? 最初と2番目を追加してから、その結果を3番目に追加し、その結果を4番目に追加します。

あなたは何をしていますか?

List(1,2,3,4,5).foldLeft(0)(_ + _) 

「+」は、あなたが最初のオペランドは、これまでの要素への適用の結果であること、および第2オペランドは次の要素であることと、適用する機能です。 最初のアプリケーションには "これまでの結果"がないので、開始値を指定します。この場合は、追加の識別要素であるため、0にします。

が倍で、それは

List(1,2,3,4,5).foldLeft(1)(_ * _) 

フォールドだろう、あなたは、リストのすべての要素を乗算したいと、それはあなたがチェックしたい場合があります独自のWikipedia pageのしています。

もちろん、foldLeftfoldRightのScalaDocエントリもあります。私の経験によると、ワークアウトへの最善の方法の一つ直感は、それは非常に単純な例でどのように動作するかを確認することです

関連する問題