問題タブ [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.
java - リストから要素を削除する「純粋な」関数をどのように記述しますか?
Java (または同様の言語) では、リストから要素を削除する純粋な関数(またはメソッド) をどのように記述しますか。
要素がリストにある場合は、入力リストのすべての要素から削除した要素を除いた新しい (理想的には不変の) リストを返すだけです。
しかし、要素がリストに見つからない場合はどのように処理しますか?
メソッドがと 削除するの 2 つのパラメーターを受け取るlist
とします。element
このメソッドを呼び出し、element
内部に含まれていない場合list
:
- 例外をスローすると、おそらくメソッドが「不純」になります (?)
- 入力リストを変更してブール値を返す ( List#remove()と同様) と、メソッドが「不純」になると考えられます (入力の変更は副作用になります)。
- このメソッドを呼び出していた場合、入力を出力として返すことは直感的ではないように思えます。
- を返します
Optional.of(listCopy)
(編集:投稿後に質問に追加されました) - 他のアイデアはありますか?
編集
の最初の出現のみを削除したいことを述べたはずですelement
。そのため、入力list
に が複数出現する場合element
、remove() メソッドへの 1 回の呼び出し (たとえば を使用) ですべてを削除したくありませんstream().filter()
。これを反映するために、コード例のコメントを編集しました。ただし、これは私の質問には完全には関係ありません。私の主な質問は、メソッドを直感的に使用し、「純粋」に保つ方法を中心に展開しているためです。
編集2
上記の提案に追加のアイデアを追加しました。戻るOptional.of(listCopy)
ことは、これまでに提案されたソリューションの中で最もエレガントなソリューションのようです。要求された操作が成功したかどうかを呼び出し元に強制的にチェックさせ、AND (成功した場合) は新しいリストを返すため、元の入力リストは変更されません。操作が失敗した (element
内に見つからなかったlist
) 場合、メソッドは を返しますOptional.empty()
。これは、後述の参照整合性も満たしているように思えます。
javascript - Google Apps Script ですべての関数を「純粋な関数」として記述することは可能ですか?
関数型プログラミングに興味があるので、 Google スプレッドシートファイルのスクリプト環境でこのアプローチを試すことにしました。スクリプト言語はGoogle Apps Scriptであり、基本的にはjavascriptです。また、一部の (すべてではないにしても) ES6 構文もサポートしています。
問題は、次のようなコードを直接実行できないことです。
つまり、グローバルに実行することはできません。任意の名前の関数を定義し、その関数内にコードを配置する必要があります。関数を実行できるため、関数はコードを内部で実行します。
ですから、「なぜこの動作が純粋な関数型コードの記述に問題を引き起こすのか?」と疑問に思うかもしれません。私が知っているように、純粋関数に関する最も重要な要素は次の 2 つです。
1)関数内でグローバル変数/関数を使用してはなりません。代わりに、パラメーターとして(そしてもちろん引数として)渡す必要があります。
2) 関数内で関数を定義することは、コードの読みやすさと構成の点であまり良い考えではありません。
したがって、1つの「メイン」関数だけでなく、より多くの関数を(いくつかのことを行うために)定義したいのですが、2つのうち少なくとも1つに違反することなく、コードを(全体として)記述する単一の方法を見つけることができませんでした上記のステートメント。
つまり、非純粋な関数を少なくとも 1 つ作成しないと、何も記述できません。