問題タブ [fold]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
7 に答える
5559 参照

haskell - folderr を使用して zip を実装する

私は現在、Real World Haskell の第 4 章に取り組んでおり、 foldr に関して foldl を実装することに頭を悩ませようとしています。

(これが彼らのコードです:)

同じ手法を使って実装しようと思っzipたのですが、進展がないようです。それは可能ですか?

0 投票する
2 に答える
1319 参照

haskell - Project Euler 27 での C スタック オーバーフロー

Haskell の学習を始めたばかりで、書籍やチュートリアルを読むことと、Project Euler の問題を解決することを組み合わせています。次のコードを使用すると「C スタック オーバーフロー」エラーが発生するため、問題 27に固執しています。

euler.hs

コマンド ウィンドウ

このコマンドは、オイラー係数 1 と 41 (40 個の素数) を返します。

これは「Cスタックオーバーフロー」で失敗します(問題の定義にも記載されている係数-79と1601を取得したかった):

エラーが発生する理由と解決方法を教えてください。ありがとうございました!

私はウィンハグを使っています。

0 投票する
3 に答える
357 参照

haskell - これらの値は、この haskell 関数のどこから来ていますか?

私が次の機能を持っているとしましょう:

の結果はsumAll [(1,1),(2,2),(3,3)]になります12

私が理解していないのは、(x,y)値がどこから来ているのかということです。ええと、それらが変数から来ていることは知っていますが、そのxs方法がわかりません。上記のコードを where キーワードなしで直接実行すると、次のようになります。

fそして、上のコードでは、変数と(x,y)変数が(\(x,y) -> x+y)ラムダ式をどのように表しているのか理解できません。

0 投票する
7 に答える
38271 参照

recursion - foldr と foldl (または foldl') の意味

まず、私が読んでいるReal World Haskellfoldlは、決して使用せず、代わりに使用するように言っていますfoldl'。だから信頼している。

しかし、私はいつfoldr対を使うべきかについてぼんやりしていますfoldl'。目の前に並べられた仕組みの違いはわかるのですが、「どっちがいい」と理解できないほどバカです。両方とも同じ答えを生成するため、どちらを使用しても問題ないように思われると思います (そうではありませんか?)。実際、この構造に関する私の以前の経験は、Rubyinjectと Clojure のreduceもので、「左」と「右」のバージョンがないようです。(補足質問: どのバージョンを使用していますか?)

私のようなスマートに挑戦するソートを助けることができる洞察は大歓迎です!

0 投票する
4 に答える
1041 参照

.net - F# - リストを間隔で連結された文字列に分割する

電子メール アドレスのリストがあり、各アドレスに電子メール通知を送信する必要があります。一度に 25 個のアドレスのブロックでこれを行いたいと思います。F# のような関数型言語で、25 個の電子メール アドレスをまとめて "折りたたむ" (連結する) 簡単な方法はありますか?それぞれがセミコロンで区切られています。.NET に String.Split メソッドがあることは知っていますが、一度に 25 個を連結する必要があります。

F# でこれを実行する最もエレガントな方法は何ですか?

0 投票する
4 に答える
2628 参照

haskell - この Haskell コードが無限リストでうまく機能するのはなぜですか?

無限リストで正しく動作する Haskell コードがいくつかありますが、なぜうまく動作するのわかりません。(無限リストを処理しなかった元のコードを変更して、オンラインの他のコードから何かを組み込むと、突然、それが機能することがわかりましたが、理由はわかりません)。

私の理解では、foldr はリスト内のすべての項目をループするということです (そして、おそらくその理解は不完全です)。もしそうなら、「ステップ」関数がどのように表現されているかは問題ではありません...コードは無限ループを処理できないはずです。

ただし、次のように動作します。

私が理解するのを手伝ってください:なぜ??

0 投票する
5 に答える
1872 参照

functional-programming - 「折りたたみの普遍的な性質」について、できるだけ簡単に、専門用語を使わずに英語で説明してください。

私は「Real World Haskell」に取り組んでおり、「折り畳みの普遍性と表現力に関するチュートリアル」という無料の PDF につながっています。「折り目」が「普遍的」であることを強調しています。私は彼の「普遍的」の定義に取り組んでおり、すでにそれを消化するのに時間を費やしている人たちに聞きたいです:可能な限り簡単で専門用語のない英語で説明してください、「折り畳みの普遍的な特性」? この「普遍的な財産」とは何で、なぜ重要なのでしょうか?

ありがとう。

0 投票する
4 に答える
914 参照

haskell - この最初の Haskell 関数は無限リストの処理に失敗するのに、この 2 番目のスニペットは無限リストの処理に成功するのはなぜですか?

私は 2 つの Haskell 関数を持っていますが、どちらも私と非常に似ているようです。しかし、最初のものは無限リストに対して失敗し、2 つ目は無限リストに対して成功します。その理由を正確に突き止めようと何時間も試みてきましたが、役に立ちませんでした。

どちらのスニペットも、Prelude の「単語」機能を再実装したものです。どちらも有限リストに対してうまく機能します。

無限リストを処理しないバージョンは次のとおりです。

無限リストを処理するバージョンは次のとおりです。

注: 「charIsSpace」は、単に Char.isSpace の名前を変更したものです。

次のインタープリター セッションは、最初のセッションが無限リストに対して失敗し、2 番目のセッションが成功することを示しています。

編集:以下の回答のおかげで、私は今理解していると思います。これが私の結論と修正されたコードです。

結論:

  1. 私の最初の試みの最大の原因は、「step space []」と「step char []」で始まる 2 つの方程式でした。ステップ関数の 2 番目のパラメーターを [] に対して一致させることは、2 番目の引数全体を強制的に評価するため、no-noです (ただし、以下で説明する注意事項があります)。
  2. ある時点で、(++) は右辺の引数を cons よりも遅く評価するのではないかと考えていました。そこで、「= (char:x):xs」を「= [char : x] ++ xs」に変更することで問題を解決できるのではないかと考えました。しかし、それは間違っていました。
  3. ある時点で、2 番目の引数を (x:xs) に対してパターン マッチングすると、関数が無限リストに対して失敗するのではないかと考えました。私はこれについてほぼ正しかったが、完全ではない! 上記のパターン マッチで行ったように、(x: xs ) に対して 2 番目の引数を評価すると、何らかの再帰が発生します。「:」(別名、「短所」)に達するまで「クランクを回します」。それが起こらなければ、私の関数は無限リストに対して成功しません。ただし、この特定のケースでは、私の関数は最終的にスペースに遭遇し、その時点で「短所」が発生するため、すべて問題ありません。また、(x:xs) に対するマッチングによってトリガーされる評価は、その場で停止し、無限再帰を回避します。その際、「x」はマッチしますが、xsはサンクのままなので問題ありません。(それを理解するのを本当に助けてくれたGaneshに感謝します)。
  4. 一般に、評価を強制しない限り、2 番目の引数について自由に言及できます。x:xs と照合した場合は、xs の評価を強制しない限り、必要なだけ xs に言及できます。

というわけで、修正後のコードです。私は通常、head と tail を避けようとしますが、それは単にそれらが部分的な関数であるという理由と、同等のパターン マッチングを書く練習が必要だからです。

これは、無限リストに対して正しく機能します。先頭、末尾、または (++) 演算子が見えないことに注意してください。

さて、重要な注意点として、 最初に修正したコードを書いたとき、「step _ []」に一致する 3 番目の式がありませんでした。その結果、網羅的でないパターン マッチに関する警告を受け取りました。明らかに、その警告を回避することをお勧めします。

しかし、私は問題が発生するだろうと思っていました。2 番目の引数を [] に対してパターン マッチすることは問題ないことは既に述べました。しかし、警告を取り除くためにそうしなければなりません。

しかし、「step_[]」式を追加すると、すべてうまくいきました!無限リストでも問題ありませんでした!. なんで?

修正されたコードの 3 番目の式は決して到達しないためです。

実際、次の BROKEN バージョンを考えてみましょう。空のリストのパターンを他のパターンの上に移動したことを除いて、正しいコードとまったく同じです。

step が呼び出されたときに最初に発生することは、インタープリターが式 1 が一致するかどうかを確認することであるため、スタック オーバーフローに戻ります。そのためには、2 番目の引数が [] であるかどうかを確認する必要があります。そのためには、2 番目の引数を評価する必要があります。

方程式を他の方程式の下に移動すると、最初または 2 番目のパターンのいずれかが常に一致するため、3 番目の方程式が試行されないことが保証されます。3 番目の式は、網羅的ではないパターン警告を省略するためのものです。

これは素晴らしい学習経験でした。ご協力いただきありがとうございます。

0 投票する
4 に答える
794 参照

haskell - これは、Haskell の folderr 関数の正しい書き方ですか?

私はYAHT の再帰的データ型セクションの演習を行っていましたが、関数を書くのが少し難しいことに気付きました (主な理由は、最初はとlistFoldrの違いがよくわからなかったからです)。関数がどのように機能するかを最終的に正確に理解したとき、関数を関数に変更するために必要なのは関数の引数の単純な交換だけであると判断しました。foldlfoldrfoldrlistFoldllistFoldr

これは機能しているようです(これよりも多くのテストを行いました):

しかし、演習に与えられた解決策は、私のものとは大きく異なります。それらlistFoldlは私のものとまったく同じですが、それらを見てくださいlistFoldr

私のソリューションと彼らのソリューションのどちらが優れていますか? それらの1つは間違っていますか?(私のテストでは、どちらもまったく同じ結果になります...)

0 投票する
1 に答える
178 参照

vim - Vim で折り目を開かずにタイトルを編集できない

図のように、閉じた折り目にカーソルがあるとします。

代替テキスト http://dl.getdropbox.com/u/175564/foldEdit.png

Vimで折り畳みを開かずにSMALLAPPSのタイトルを編集するにはどうすればよいですか?