2016-10-20 6 views
2

私はClojureと一般的な関数プログラミング(Pythonに由来)を学んでいます。 Clojureでは、slurpや他の入力手段を使うことができるので、不純な関数を作ることは可能です。 Clojureで不純な関数を簡単に識別する方法はありますか、あるいはそれらの関数をコードの別のセクションに保存するだけですか?Clojureで不完全な関数を識別する

+2

実際にはありません。とにかく、あなたは "不純な機能"をどのように定義しますか? ['memoize'](https://clojuredocs.org/clojure.core/memoize)は不純ですか? 'memoize'によって返される関数はどうでしょうか?または、内部的に[transients](http://clojure.org/reference/transients)を使用する参照性の高い関数ですか? –

+2

Clojureは、たとえばHaskellのような純粋なFP言語ではありません。これがあなたにとって重要なのであれば、Clojureは正しい選択ではありません。 –

+0

@MichielBorkent:純粋であることは私には重要ではない、私はちょうど誰かが純粋なセクションと不純なセクションを分けることができれば面白いと思った。 – RFVenter

答えて

1

理論的には、関数が副作用を生成するかどうかを特定する方法はありません(Riceの定理のため)。したがって、純関数と不完全関数を区別することはおそらく不可能です。もちろん、構文レベルで関数が間違っているかどうかをチェックする方法があるかもしれませんが、実際にはこれが実際に助けになるかどうかは疑問です。

0

ファンクション名をbang(例:swap!)で終了するには、かなり多くの共通機能がありますが、その機能はSTMトランザクションで使用するのに安全ではありません。これにはIOと多くのタイプの副作用が含まれているため、ここでは不純物と重複していますが、多くの不純な機能も完全に安全です。

+0

スワップはSTMの一部であるため、「STM内で使用するには安全ではありません」と言い換えてください;-)それは完全に安全です。 –

+0

@ArthurUlfeldtこの文言は、すでにライブラリコーディング標準のフレーズと非常によく似ています。「STMトランザクションで安全でないものにのみ使用!」だから私はそれをどのように改善できるかはわかりません。 –

+0

'dosync'ブロックの中から' swap! 'を使うのを避けるのは、安全ではないと思っているからです。私たちはこのような噂を開始するこのようなサイトに声明を残すことに注意する必要があります。 STMの内部で使用するのが実際には危険な例を選択することができますが、これは名前が終わるすべての関数では当てはまりません。 –