タグ付けされた質問 「fold」

7
ScalaのfoldLeftとreduceLeftの違い
私は基本的な違いを学んだの間foldLeftとreduceLeft foldLeft: 初期値を渡す必要があります reduceLeft: コレクションの最初の要素を初期値として受け取ります コレクションが空の場合は例外をスローします 他に違いはありますか? 同様の機能を持つ2つのメソッドがある特定の理由は?


7
foldrとfoldl(またはfoldl ')の関係
まず、私が読んでいるReal World Haskellは、を使用foldlせず、代わりにを使用するように言っていますfoldl'。だから私はそれを信頼しています。 しかし、私はfoldrvs をいつ使うべきか迷っていますfoldl'。私の目の前では、それらがどのように機能するかについての構造がわかりますが、私は愚かすぎて、「どちらが良いか」を理解できません。どちらも同じ答えを返すので、どちらを使用しても問題にはならないように思えます(そうではありませんか?)。実際、このコンストラクトに関する私の以前の経験は、Ruby injectとClojureの経験でありreduce、これらには「左」バージョンと「右」バージョンがないようです。(サイド質問:彼らはどのバージョンを使用していますか?) 私のような賢い挑戦的なソートを助けることができるどんな洞察も大いに感謝されます!


4
無限リストでのfoldlとfoldrの動作
この質問の myAny関数のコードでは、foldrを使用しています。述語が満たされると、無限リストの処理を停止します。 私はfoldlを使って書き直しました: myAny :: (a -> Bool) -> [a] -> Bool myAny p list = foldl step False list where step acc item = p item || acc (step関数への引数は正しく逆になっていることに注意してください。) ただし、無限リストの処理を停止しなくなりました。 私はApocalispの答えのように関数の実行を追跡しようとしました: myAny even [1..] foldl step False [1..] step (foldl step False [2..]) 1 even 1 || (foldl step …

4
フォールドとリデュースの違いは?
F#を学習しようとしましたが、フォールドとリデュースを区別しようとすると混乱しました。Foldも同じように見えますが、追加のパラメーターを受け取ります。これらの2つの機能が存在する正当な理由はありますか、それとも背景が異なる人々に対応するためにありますか?(例:文字列およびC#の文字列) これは、サンプルからコピーしたコードスニペットです。 let sumAList list = List.reduce (fun acc elem -> acc + elem) list let sumAFoldingList list = List.fold (fun acc elem -> acc + elem) 0 list printfn "Are these two the same? %A " (sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])

9
関数型プログラミングの「fold」関数に相当する「pythonic」とは何ですか?
Haskellで次のようなことを実現する最も慣用的な方法は何ですか? foldl (+) 0 [1,2,3,4,5] --> 15 またはRubyでの同等のもの: [1,2,3,4,5].inject(0) {|m,x| m + x} #> 15 明らかに、Pythonはreduce上記とまったく同じように、foldの実装である関数を提供しますが、プログラミングの「pythonic」の方法は、lambda項と高次関数を避け、可能な場合はリスト内包を優先することだと言われました。したがって、リスト、またはreduce関数ではないPythonのリストのような構造を折りたたむ好ましい方法はありますか、またはreduceこれを達成する慣用的な方法はありますか?

4
fold-leftを使用するタイミングとfold-rightを使用するタイミングをどのようにして知っていますか?
fold-leftは左寄りのツリーを生成し、fold-rightは右寄りのツリーを生成することを認識していますが、フォールドに到達すると、どの種類のフォールドを決定しようとして頭痛を誘発する思考に行き詰まることがあります。適切です。私は通常、問題全体をほどき、問題に当てはまるようにfold関数の実装を段階的に実行します。 だから私が知りたいのは: 左に折りたたむか右に折りたたむかを決定するための経験則は何ですか? 私が直面している問題を踏まえて、どのタイプの折り目を使用するかをすばやく決定するにはどうすればよいですか? 要素リストのリストを単一のリストに連結するflattenと呼ばれる関数をフォールドを使用して記述する例がScala by Example(PDF)にあります。その場合、正しいリストは適切な選択です(リストを連結する方法を考えると)が、その結論に達するには少し考えなければなりませんでした。 (関数型)プログラミングではフォールディングが非常に一般的なアクションであるため、この種の決定を迅速かつ自信を持って行えるようにしたいと思います。だから...何かヒントはありますか?


3
折りたたみ後の後処理ステップなしでこの単語機能を実装することは可能ですか?
印刷物のReal World Haskell、第4章、98ページでは、words折りたたみを使用して実装できるかどうかを尋ねられますが、これも私の質問です。 出来ますか?そうでない場合、なぜですか?もしそうなら、どうですか? 私は次のことを思いつきました、これは各非スペースが出力リストの最後の単語の前に追加されるべきであるという考えに基づいています(これはotherwiseガードで発生します)、そして空白は空の単語の追加をトリガーするべきであるという考えに基づいています出力リストがまだ存在しない場合(これがで取り扱われますif- - )。thenelse myWords :: String -> [String] myWords = foldr step [[]] where step x yss@(y:ys) | x == ' ' = if y == "" then yss else "":yss | otherwise = (x:y):ys 入力文字列の先頭にスペースがあると、文字列の出力リストに1つの空の文字列が先行するため、このソリューションは間違いです。 上記のリンクで、私は他の読者のために提案された解決策のいくつかを調べました、そしてそれらの多くは私の解決策と同様に動作しますが、それらは一般的に、例えば、tailもしあるならそれを空の先行文字列です。 他のアプローチはタプル(実際にはペアのみ)を使用するため、フォールドはペアを処理し、先頭/末尾のスペースを適切に処理できます。 これらすべてのアプローチfoldr(または別のフォールド、fwiw)は、箱から出して最終的な出力を提供する関数ではありません。なんとかして出力を調整しなければならない何かが常にあります。 したがって、私は最初の質問に戻って、words折りたたみを使用して(末尾/先頭/繰り返しのスペースを正しく処理する方法で)実際に実装できるかどうかを尋ねます。折り目を使用して、私は折りたたみ機能は、最も外側の関数でなければならないことを意味します。 myWords :: String -> [String] myWords …

3
このようなfoldlMの定義を書き留めるには、どのような知識やトレーニングが必要ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 7か月前に閉鎖。 最近、私は実際のケース生産システムの一部でHaskellを使用しようとしています。Haskell型システムは本当に私に大きな助けを提供してくれます。たとえば、あるタイプの関数が必要だと気付いたとき f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b そこのような機能は、実際にあるfoldM、foldlMとfoldrM。 ただし、本当にショックを受けたのは、次のようなこれらの関数の定義です。 foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b foldlM f …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.