問題タブ [pure-function]

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 投票する
1 に答える
907 参照

java - Java では、これらすべてのメソッドは純粋な関数と見なされますか?

このプログラムは、ユーザーが入力した文字列が回文かどうかを判断します。

public class PurePalindrome は ConsoleProgram を拡張します {

}

これらすべてのメソッドは純粋な関数と見なされますか? そうでない場合、なぜですか?メソッドが純粋な関数かどうかを判断するのに少し苦労しています。

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

haskell - 純粋関数は自由変数を持つことができますか?

たとえば、自由変数のない参照透過関数:

は、( の観点からf) 自由な変数opと を持つ関数になりましたx:

f参照透過性もあります。しかし、それは純関数ですか?

純粋な関数ではない場合、参照透過的であるが、外側のスコープにバインドされた 1 つ以上の変数を使用する関数の名前は何ですか?


この質問の動機:

ウィキペディアの記事からはわかりません:

結果値は、すべて (またはいずれか) の引数値に依存する必要はありません。ただし、引数の値以外に依存する必要はありません。

(私のものを強調)

また、 Google検索からも、純粋な関数が自由な (関数のスコープにバインドされていないという意味で) 自由な変数に依存できるかどうかはわかりません。

また、この本には次のように書かれています。

自由変数のない関数が純粋なら、クロージャーは不純ですか?

関数function (y) { return x }は面白いです。これには、自由変数 x が含まれます。自由変数は、関数内でバインドされていない変数です。これまで、変数を「バインド」する方法は 1 つしか見てきませんでした。つまり、同じ名前の引数を渡すことです。関数function (y) { return x }には x という名前の引数がないため、変数 x はこの関数にバインドされず、「フリー」になります。</p>

関数で使用される変数が束縛されているか自由であるかがわかったので、関数を自由変数を持つものと持たないものに分けることができます。

  • 自由変数を含まない関数は純粋関数と呼ばれます。
  • 1 つ以上の自由変数を含む関数はクロージャと呼ばれます。

では、「純粋関数」の定義は何ですか?

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

gcc - GCC と Clang: 純粋な最適化を無効にする

さまざまな libc 文字列関数を比較する一連のベンチマークを実行しています。問題は、関数が「pure」および「const」とマークされているため、GCC と Clang がループ内の計算を最適化していることです。その最適化をオフにするか、それを回避する方法はありますか?

0 投票する
0 に答える
111 参照

c# - プリミティブ型を操作する場合にのみ PureAttribute を保証できますか?

JetBrains の注釈:

メソッドが監視可能な状態の変更を行わないことを示します。System.Diagnostics.Contracts.PureAttribute と同じ

マイクロソフト コード コントラクト:

型またはメソッドが純粋であること、つまり、目に見える状態の変更を行わないことを示します。

プリミティブ型を操作する場合、メソッドが純粋な関数かどうかは非常に簡単にわかります。

ただし、次のシナリオを検討してください。

ReSharperは、「純粋なメソッドの戻り値は使用されていません」と言っていますが、これは明らかに正しくありません。状態が変化し、非常に目に見える方法で変化するからです。もちろん、静的メソッドが常に純粋であることを意味しない限り? それ以外の場合、GetEnumerator() をオーバーライドするときにあらゆる種類の状態操作を実行できるため、LINQ 拡張メソッドはどれも純粋ではありません。

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

clojure - ガベージ コレクションの前にアクションを実行する

特定のエンティティへの参照がなくなった後、ガベージ コレクターがそのデータを消去する前に、特定のエンティティに対していくつかのアクションを実行したいと考えています。私はこれを、より「純粋に機能的な」GUI抽象化の実験に使用しています。これが私がやりたいことです:

A では、幅と高さを指定してウィンドウ インスタンスが作成されます。最終的には、B のウィンドウを変更したいと考えています。コードはこれを不変アクションのように扱いますが、ウィンドウの下では、変更を反映するために単純に変更されます。B スコープのウィンドウが存在するときに A スコープのウィンドウで実行されるアクション (マルチスレッドの場合) は、何らかの方法で許可されません。

C では、B で作業を終えて let スコープを離れた後、B ウィンドウ オブジェクトは参照されず、ガベージ コレクションが行われます。しかし、B の変更をロールバックし、A のスコープ アクティビティを再び受け入れる必要があることを、基になるウィンドウ メカニズムに通知したいと考えています。したがって、C でのアクションは、B の効果が発生しなかったかのようになります。

同様に、最上位の A ウィンドウが参照されなくなった場合は、ガベージ コレクションの前に何らかの方法で自身を破棄する必要があります。

ウィンドウ参照を登録するグローバル状態を make-window に変更させることでこれを管理できる可能性がありますが、B スコープ参照が失われた時点を検出する方法がわかりません。データへの参照を確認するにはどうすればよいですか? または、この問題に対処する他の方法はありますか?

これはやや複雑なセットアップであることは認識していますが、GUI プログラミングのステートフル性を調整し、可能な限り純粋に見えるようにする方法を見つけたいと考えています。

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

c++ - 仮想純関数を使用したフィールドへのアクセスでのセグメンテーション違反

純粋な仮想呼び出しのエラーについてよく読みましたが、コードの何が問題なのかわかりませんでした:

ポリモーフィズムを使用して、チェス ゲームをプログラミングしました。

ここにいくつかのコード:

Piece.hpp (すべてのゲーム ピースの親)

Rook.hpp (例)

およびRook.cpp

ボード::ボード()

ボード::印刷

私はその行で立ち往生しています:

pieceUnicode = ボード[i][j]->getUnicodeSymbol();

私は得る:

呼び出された純粋仮想メソッド

コンストラクタまたはデストラクタ内で関数を呼び出さなかった

virtual上記のデストラクタにキーワードを入れたら~Piece()、この問題は解決しました。しかし、今は同じ行にいます

シグナル: SIGSEGV (セグメンテーション違反)

何か案は?

ここにいくつかの詳細情報:

私は chess.cpp のメイン内でボードを宣言します:

ボードボードゲーム;

次に、次のように void playGame(Board boardGame) に送信します。

playGame(ボードゲーム);

内部では、次のように void getNextMove(Board board, string whitePlayer, string blackPlayer) に送信します。

getNextMove(boardGame, whitePlayer, blackPlayer);

そして、私は使用しています:

boardGame.print();

0 投票する
0 に答える
141 参照

mysql - MySQL で now() の出力を設定するにはどうすればよいですか?

テストが実際の値と期待される値を比較する場合に、MySQL ストアド プロシージャと関数に対して自動テストを実行したいと考えています。

問題は、各テストの前にフィクスチャ スクリプトを実行したとしても、ほとんどのルーチンが同じ入力に対して異なる結果を返す可能性があることですnow。(nowは、現在の日時を返す組み込み関数です。)

nowテストデータベースで返されるものをどのように「凍結」できますか?

私が考えることができる最善の解決策は、すべての呼び出しをnowカスタム関数への呼び出しに置き換えることです。私たちの prod データベースでは、このカスタム関数は組み込みの を呼び出すだけnowで、dev データベースでは静的な日付を返します。

のような簡単な方法はありSET global.CURRENT_TIME = '2015-01-01 00:00:00';ますか?

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

c++ - 「入力状態」ゲッター メソッドに関する GCC `__attribute__ ((pure))` の提案 - 正しいですか?

でコンパイルすると、GCC は、最適化のため-Wsuggest-attribute=pureに でマークできる潜在的な関数を提案します。__attribute__ ((pure))

GCC のドキュメントでの定義は次のとおりです。pure

多くの関数は戻り値以外には影響を与えず、その戻り値はパラメーターやグローバル変数のみに依存します。このような関数は、算術演算子と同様に、一般的な部分式の削除とループの最適化の対象となります。これらの関数は属性 pure で宣言する必要があります。

メンバーinput_contextを含むクラスがある小さなゲームエンジンを作成しています。input_stateこのinput_contextクラスinput_stateは、オペレーティング システムからグローバルな入力状態を取得することにより、フレームごとにメンバーを更新します。

また、入力状態を照会するための「ゲッター」もいくつか含まれています。

簡単な例:

mouse_x()GCC は、 、 、 などのこれらすべての「ゲッター メソッド」が の候補であるmouse_y()と言っています。is_key_down()__attribute__ ((pure))

これらのメソッドを としてマークする必要がありpureますか?

私はそうは思いませんが、GCC の提案を見て疑問に思いました。

GCC の定義を解釈する方法がわかりません。パラメーターやグローバル変数のみにpure依存する関数はそのようにマークする必要があると書かれています。

  • ある意味では、グローバル OS 入力状態はグローバル変数として解釈できます。

  • 一方、「getter メソッド」は、_input_stateメンバー変数に応じて、常に異なる値を返します。