問題タブ [side-effects]
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.
scala - map および scala の for ループの予期しない副作用
おそらく簡単な質問ですが、API から満足のいく答えが見つかりませんでした。私は素敵なコードを書こうとしているわけではありませんが、特定のことがどのように機能するかについてもっと学ぼうとしています:
最初の HashMap を作成しました。任意のリストから、マップを使用して HashMaps のリストを作成したいと思います。.map 関数内の HashMap に (キー、値) ペアを追加します。したがって、このリストの後続のインデックスでは、格納された HashMap のサイズが 1 ずつ増加する必要があります (つまり、list(i).size == list(i+1).size - i ごとに 1)。
しかし、次のコードを切り取ると、すべて等しいマップ (つまり、完全な HashMap) のリストが得られます。ただし、成長する初期 HashMap を出力すると、すべてが正しいように見えます。
私が期待したのは次のようなものでした
List(Map(1 -> 2), Map(1 -> 2, 2 -> 4), Map(1 -> 2, 2 -> 4, 3 -> 5), Map(1 -> 2, 2 -) > 4、3 -> 5、4 -> 6))
ジェネレーティブ for ループを使用した同等の (だと思います) バージョンでは、まったく同じ結果が得られます。
基本的なステップが欠けていると思いますが、どれがわかりません。さらに助けていただければ幸いです。
後続の質問: (キー、値) ペアが出力される順序は明らかに常に同じです (ただし、それらが要素であった順序ではありませんが、いずれにせよ Map からこれを期待していません。これは自然なことです)。常にそうであるように見えるペアが保存されると、バックグラウンドで何が起こりますか?
list - Haskell:なぜこれが空のリストの例外につながるのですか?
私は現在、楽しみのためにProject Eulerに取り組んでおり、練習にはHaskellを使用しています。ただし、問題が発生し、より小さな例を作成できないようです。そのため、コードは次のとおりです(プロジェクトオイラー232の場合)。
ここで悪いスタイルを無視してください:)
これをロードしてここでsumBuild(7、5)を実行すると、例外が発生します。
しかし、sumBuildを次のように変更すると:
また
その後、正常に動作します。
副作用がなく、2回の実行で異なる結果が生成されるため、これは私にとって本当に混乱します(少なくともそのような場合のようです)。ここでの問題は何ですか?
誰かがこのプログラムを最小限の実用的な例に編集することができれば、私は本当に感謝しています!
助けてくれてありがとう!
haskell - Haskell-実行後にトレースを印刷する
私は、Uniが単純な命令型言語用のコンパイラー(Haskellで)を作成するプロジェクトを持っています。要件の1つは、関数呼び出しの開始、関数の終了、および変数の割り当て時にデバッグステートメントを出力することです。
関数を入力するときにメッセージを印刷するのは簡単です。私はDebug.traceを使用します。例:
変数に割り当てる場合も同じプロセスが適用されます。私が理解できないのは、関数呼び出しから戻ったときに印刷し、出力を他の出力と正しくタイミングを合わせる方法です。これまでに行ったすべての試みの結果、「関数の開始」の直後に「関数の終了」が出力されました。「関数の終了」を出力する前に、関数の内部デバッグステートメント(関数の割り当てとネストされた呼び出し)を出力する必要があります。
私の命令型の習慣は、leave-function出力の前に(evaluateFunction functionArguments)の実行を強制する方法が必要であることを教えてくれますが、これはHaskellでは不可能で間違っているようです。
私が今得た出力例:
同じプログラムの出力は、私が必要とする方法で表示されます。
では、「myFunctionWithTracesを実行してからmyStringを出力する」のHaskellイディオムは何ですか?
c# - LINQ Select 呼び出しの悪いコードを介して新しいスレッドを生成していますか?
ReSharper は、私が持っていた foreach ループをこのようなものにリファクタリングしました。デリゲートの BeginInvoke を介して一連のスレッドを生成し、さまざまなパラメーターをリストに格納して、IAsyncResults をコレクションに格納したいと考えました。
私の本能的な反応は、これは良い習慣ではないということです。BeginInvoke は新しいスレッドが生成されるという副作用を引き起こしていますが、Select に渡された関数は副作用を引き起こすべきではありません。
それとも、呼び出しスレッドで何も変更していないので、大丈夫ですか?
collections - コレクションがいつ作成されるかを決定するものは何ですか?
私の理解が正しければ、Clojure は (他の Lisp のように) リストだけでなく、ベクトルとセットも返すことができます。
私が本当に得られないのは、返されるコレクションが常にあるとは限らない理由です。
たとえば、次のコードを使用するとします。
128 64 32 16 8 4 2 を出力します。しかし、それは単にprintlnが呼び出され、printlnが何かを出力するという副作用 (?) を持っているためです。
だから私はこれに置き換えてみました(printlnを削除します):
そして、次のようなコレクション(おそらくリスト)を取得することを期待していました:
しかし、代わりにnilを取得しています。
コレクションを作成するものとそうでないものを決定するものと、あるものから別のものに切り替える方法がわかりません。また、Clojure が何らかの形で「関数型」のプログラミング方法を奨励していることがわかりましたが、ほぼ常にコレクションを返すことになっているのではないでしょうか?
明らかにコレクションを返さない関数が非常に多いのはなぜですか? そして、これらの戻り値のコレクションを作成する慣用的な方法は何でしょうか?
たとえば、最初にコレクションを構築してから、結果のリスト/ベクトル以外の慣用的な方法で反復 (?) することによって、上記の問題をどのように解決しますか?
まず、ループを変換してnil以外のものを生成する方法がわからないため、次のことを試しました。
しかし、期待していた「1 2 3nil」ではなく、 「1 2nil 3nil」と表示されます。
これは基本的なことだと思いますが、始めたばかりで、明らかに基本的なことが欠けています。
(PS: 適切に再タグ付けしてください。ここでどの用語を使用すればよいかわかりません)
ocaml - OCamlの副作用とトップレベルの表現
私はocamlに困っています。
カウンターを呼び出すたびにカウンターをインクリメントし、vargen文字列をカウンター番号と連結して、この新しい文字列を返す関数を作成したいと思います。
私が成功せずにしたことは次のとおりです。
しかし、私の出力は常に次のとおりです。
そして、私の出力はどうあるべきか:
私の問題を解決するためのアイデアはありますか?
みんなありがとう。
javascript - JavaScript関数に副作用があるかどうかを判断する方法はありますか?
Javascript関数が与えられた場合、その関数に副作用がないことを確認することは可能ですか。つまり、関数は、関数のスコープ外で宣言された変数の値を変更しませんか?
functional-programming - 例外の発生が副作用になるのはなぜですか?
side effectのウィキペディアのエントリによると、例外の発生は副作用を構成します。この単純な python 関数を考えてみましょう:
で呼び出すと、foo(None)
常に例外が発生します。同じインプット、同じアウトプット。参照透過です。なぜこれは純粋な関数ではないのですか?
algorithm - 関数型言語で実装するのが難しいアルゴリズムはどれですか?
私は関数型言語に手を出していますが、いくつかのアルゴリズム(特に動的計画法を使用するアルゴリズム)は記述が難しく、最悪の場合の実行時間では効率が低下することがあります。変数が不変で副作用がある関数型言語では効率が低いアルゴリズムのクラスはありますか?
そして、誰かが私に指摘できる参照がありますか?それは、より難しいアルゴリズム(おそらく共有状態によって最適化されたもの)を書くのに役立ちますか?
ありがとう
compiler-optimization - SSAでの副作用追跡
私はJavaバイトコードのオプティマイザーに取り組んでおり、SSAを使用することにしました。ただし、ほとんどの最適化ではすべての操作が純粋に機能する必要があるため、副作用を処理するために、副作用を引き起こす可能性のあるすべての操作に不透明な状態パラメーターと戻り値を追加することにしました。これにより、副作用のある操作の最適化や並べ替えを防ぐことができます。たとえば、例外処理を無視すると、この擬似コードのようなものが得られます。
私がしていることの名前はありますか?それは良いアプローチですか?関数型言語にはモナドと呼ばれる概念があると聞きました。これは似ているように聞こえますが、同じではありません。モナドを使用する方が良いアプローチですか?もしそうなら、どうすればモナドを使用するようにこれを変更できますか?