タグ付けされた質問 「functional-programming」

関数型プログラミングは、プログラムの状態ではなく入力によって出力が決定される関数の連鎖評価によって計算問題を解決しようとするパラダイムです。このプログラミングスタイルでは、副作用と可変データは廃止され、通常は厳密に分離されます。

1
機能スタイルは依存関係のモックにどのように役立ちますか?
最近のJava Magazine号のKent Beckへのインタビューから: Binstock:マイクロサービスについて説明しましょう。一部のサービスが機能するためには、他のサービスの束全体の存在が必要になるという意味で、マイクロサービスのテストファーストは複雑になるように思えます。同意しますか? ベック:1つの大きなクラスまたはたくさんの小さなクラスを持つことについては、同じトレードオフのセットのようです。 Binstock:そうです、私が推測する場合を除いて、特定のサービスをテストできるシステムをセットアップできるようにするためには、ここでは非常に多くのモックを使用する必要があります。 ベック:そう思わない。命令型のスタイルの場合は、モックをたくさん使用する必要があります。外部依存関係がコールチェーンの上位に集められている関数型のスタイルでは、それは必要ないと思います。単体テストから多くの報道を得ることができると思います。 彼はどういう意味ですか?機能的なスタイルで、外部の依存関係をあざけることからどのように解放できますか


5
すべてのRubyをHaskellであるかのように書いても大丈夫でしょうか?
Rubyには、リスト作成、マップ、選択、収集などの優れたリスト操作機能が組み込まれています。Procs、Blocks、Lambdasがあり、優れた反復サポート(eachファミリ)があるので、もしもRubyのものをすべて最も純粋に機能的な方法で記述しますか?I / Oがほとんどまたはまったくない(したがって、明らかな副作用が少ない)コードに特に適していますか? 私はHaskell(「本当の」ハッカーの言語と呼ばれます)を学んでいて、それを行う方法に夢中になっています。 Rubyはそもそも借りたり、そこから多くを学んだりしませんか?) 建設的なガイダンスは大歓迎です...

6
関数型プログラミング言語を採用すべきですか?
私は最近、自分のコードを書く方法についてもっと心配しています。デザインパターンに関するいくつかの本を読んだ後(そしてそれらの熱狂的な実装については、きっと)、私は自分の考えを、変化するものをカプセル化することに大きくシフトさせました。インターフェースが少なく、メソッド指向のコードが多く書かれていることに気づきがちですが、述語、アクション、その他のデリゲートタスクを使用して古いクラスに活気を与えたいと思っています。変化するのは行動だと思うことが多いので、それをカプセル化します。常にではありませんが、多くの場合、インターフェイスを単一のメソッドに分解し、クライアントコードに新しいクラスを作成させるのではなく、タスクにデリゲートを使用することを好みます。 だから私はそれが私を襲ったと思います。代わりに関数型プログラミングを行うべきですか? 編集: 関数型プログラミングについて誤解している可能性があります。 現在選択している言語はC#で、C ++の出身です。私はゲーム開発者として働いていますが、現在は失業しています。 私は建築に対する情熱を持っています。私の利点は、クリーンで柔軟性があり、再利用可能で保守可能なコードです。私がこれらの方法で毒されているのか、それともより良いのかわかりません。リファクタリング熱がありますか、それとも次に進むべきですか?これは「仕事に適したツールを使用する」という疑問かもしれませんが、ご意見をお聞かせください。 関数型言語を選ぶべきでしょうか?私の恐怖要因の1つは、Visual Studioの快適さを離れることです。

4
Schemeから何を学ぶべきですか?
優れたプログラマーになるのに役立つ、Schemeから学べるユニークな機能は何でしょうか。 私は主流の言語で多くの経験があり、私の視野を広げ、他の言語にはない機能的な側面について学びたいと思っています。私はjavascriptのクロージャー、C#のラムダ式に精通しており、他の言語にはないことに焦点を当てることができるものに疑問を感じていましたか?Lisp構文を除いて、私はこれまでに他の言語で遭遇し​​たことがあるような気がします。 何か新しいことを教えてくれるScheme / Lispに固有のものは何ですか?

3
合計タイプとポリモーフィズム
昨年、私は飛躍して関数型プログラミング言語(F#)を学びました。私が発見した興味深い点の1つは、OOソフトウェアの設計方法にどのように影響するかです。私がオブジェクト指向言語で最も欠けていると思うのは、パターンマッチングと合計タイプの2つです。どこを見ても、差別的な組合で簡単にモデル化される状況が見られますが、パラダイムに不自然に感じられる一部のOO DU実装でバールを表示することに抵抗があります。 これにより、通常or、合計タイプが処理する関係を処理する中間タイプを作成するようになります。また、かなりの分岐につながるようです。Misko Heveryのような人を読んだ場合、優れたOOデザインは多態性による分岐を最小限に抑えることができると彼は示唆しています。 OOコードでできる限り避けたいことの1つは、null値を持つ型です。明らかに、or関係は1つのnull値と1つの非null値を持つタイプによってモデル化できますが、これはnullあらゆる場所でのテストを意味します。異種であるが論理的に関連付けられた型を多態的にモデル化する方法はありますか?設計戦略やパターンは非常に役立つでしょう。あるいは、一般的にオブジェクト指向のパラダイムで、異種の関連タイプについて考える方法です。

5
ベストプラクティス-関数呼び出しの周りをラップするvs関数内でガードする場合は早期終了を追加する
これは非常にユースケース固有のものになる可能性があることは知っていますが、私はあまりにも頻繁にこれに疑問を感じています。一般的に推奨される構文はありますか? 私は関数の中で最善の方法を尋ねているのではなく、早く終了するか、関数を呼び出さないかを尋ねています。 関数呼び出しの周りをラップする if (shouldThisRun) { runFunction(); } 持っている場合(ガード)機能で runFunction() { if (!shouldThisRun) return; } 後者のオプションは、この関数が複数回呼び出された場合にコードの重複を減らす可能性があることは明らかですが、関数の単一の責任性を失う可能性があるため、ここに追加すると間違っていると感じる場合があります。 例はこちら 何かのステータスを更新するupdateStatus()関数がある場合。ステータスが変更された場合にのみステータスを更新します。ステータスが変更される可能性があるコード内の場所を知っています。 私だけかどうかはわかりませんが、この関数をできるだけ純粋にしたいので、この内部関数をチェックするのは少し汚れています。これを呼び出すと、ステータスが更新されることが期待されます。しかし、変更を加えていない可能性があることがわかっているいくつかの場所で、呼び出しをチェックでラップする方がよいかどうかはわかりません。

3
関数型プログラミングで代入演算子またはループの使用が推奨されないのはなぜですか?
私の関数が2つの要件を満たしている場合、Sum リスト内の項目の合計を返す関数は、特定の条件に対して項目がtrueと評価され、純粋な関数と呼ばれる資格があると思いますか? 1)特定のi / pのセットに対して、関数が呼び出された時間に関係なく、同じo / pが返されます 2)副作用はありません public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){ int result = 0; foreach(var item in numbers) if(predicate(item)) result += item; return result; } 例: Sum(x=>x%2==0, new List<int> {1,2,3,4,5...100}); 私がこの質問をしている理由は、必須のプログラミングスタイルであるため、代入演算子とループを回避するようアドバイスしている人がほとんどいるためです。では、関数プログラミングのコンテキストでループと代入演算子を使用する上記の例で何が問題になるのでしょうか?

6
オブジェクトが可変である場合、関数型プログラミングのコンテキストで何が問題になる可能性がありますか?
不変オブジェクトのような可変オブジェクトと不変オブジェクトの利点は、共有および書き込み可能な状態が原因で、マルチスレッドプログラミングの問題のトラブルシューティングが非常に困難になることを理解できます。逆に、変更可能なオブジェクトは、毎回新しいコピーを作成するのではなく、オブジェクトのIDを処理するのに役立ちます。そのため、特に大きなオブジェクトのパフォーマンスとメモリ使用量も向上します。 私が理解しようとしていることの1つは、関数型プログラミングのコンテキストで可変オブジェクトを使用すると何が問題になるのかということです。私に言われたポイントの1つのように、異なる順序で関数を呼び出した結果は確定的ではありません。 関数プログラミングで可変オブジェクトを使用すると何がうまくいかないかが非常に明白な実際の具体例を探しています。基本的にそれが悪いのであれば、オブジェクト指向や関数型プログラミングのパラダイムに関係なく悪いのですよね? 私自身の声明自体がこの質問に答えると思います。それでももっと自然に感じられるように、いくつかの例が必要です。 OOは、カプセル化、ポリモーフィズムなどのツールを使用して、依存関係を管理し、より簡単で保守可能なプログラムを作成するのに役立ちます。 関数型プログラミングも、保守可能なコードを促進する同じ動機がありますが、OOツールとテクニックを使用する必要性を排除するスタイルを使用しています。

2
機能的なJavaScriptコードをどのように_read_できますか?
JavaScriptでの関数型プログラミングの基礎となる基本概念のいくつか/多く/ほとんどを学んだと思います。ただし、私は関数コード、特に自分で作成したコードを明確に読み取ることができず、誰かが役立つヒント、ヒント、ベストプラクティス、用語などを教えてくれるかどうか疑問に思っています。 以下のコードを見てください。私はこのコードを書きました。これは、say {a:1, b:2, c:3, d:3}との間の2つのオブジェクト間のパーセント類似性を割り当てることを目的としてい{a:1, b:1, e:2, f:2, g:3, h:5}ます。Stack Overflowでこの質問に答えてコードを作成しました。ポスターがどの程度の類似性について尋ねているのか正確にはわからなかったため、4つの異なる種類を用意しました。 2番目にある1番目のオブジェクトのキーの割合、 重複を含む、2番目にある1番目のオブジェクトの値のパーセント 重複が許可されていない、2番目に見つかった1番目のオブジェクトの値の割合、および 2番目のオブジェクトにある1番目のオブジェクトの{key:value}ペアの割合。 私は合理的に命令型のコードから始めましたが、これは関数型プログラミングに適した問題であることをすぐに理解しました。特に、私が比較しようとしている機能のタイプ(例えば、キーや値など)を定義する上記の4つの戦略のそれぞれについて関数または3つを抽出できれば、残りのコードを繰り返し可能な単位に減らす(言葉の遊びを許す)ことができます。あなたはそれを乾いた状態に保ちます。そこで関数型プログラミングに切り替えました。結果にはかなり誇りに思っており、それは適度にエレガントだと思います。 ただし、コードを自分で作成し、構築中にコードのすべての部分を理解したとしても、今振り返ると、特定の半行の読み方と読み方の両方に少し戸惑い続けています。コードの特定の半行が実際に行っていることを「グロッ」と言います。私は、すぐにスパゲッティの混乱に分解するさまざまな部分を接続するために精神的な矢を作ることに気づきました。 だから、誰かが私に、コードのより複雑なビットのいくつかを、簡潔で、私が読んでいるものの私の理解に貢献する方法で「読む」方法を教えてもらえますか?私を最も引き付ける部分は、複数の太い矢印が連続している部分、および/または複数の括弧が連続している部分だと思います。繰り返しになりますが、最終的にはロジックを理解することができますが、関数型JavaScriptプログラミングの行をすばやく明確かつ直接「取り込む」ためのより良い方法があります(私はそう思います)。 以下のコード行、または他の例を自由に使用してください。ただし、私からの最初の提案が必要な場合は、以下にいくつか示します。かなりシンプルなものから始めます。コードの終わり近くから、これがパラメーターとして関数に渡されますobj => key => obj[key]。それをどのように読んで理解しますか?より長い例は、最初から近い1つの完全な関数ですconst getXs = (obj, getX) => Object.keys(obj).map(key => getX(obj)(key));。最後のmap部分は特に私を捕まえます。 ノート、この時点で時間に私はしてくださいないなどハスケルやシンボリック抽象記法やカリー化の基礎への参照を探している私は何をしています探しているコードの行を見ながら、私は口を静かにできることを、英語の文章です。具体的にそれについて具体的に言及している参考文献があればすばらしいですが、私はいくつかの基本的な教科書を読みに行くべきだと言う答えも探していません。私はそれを実行し、私は(少なくともかなりの量の)ロジックを取得しました。また、私は完全な答えは必要ありません(そのような試みは歓迎されますが)。そうでなければ面倒なコードの単一の特定の行を読むためのエレガントな方法を提供する短い答えでさえいただければ幸いです。 この質問の一部は次のとおりだと思います:関数コードを左から右へ、上から下へ直線的に読み取ることはできますか?それとも、明らかに線形ではないコードのページにスパゲッティのような配線の精神的な画像を作成することを強いられていますか?それを行う必要がある場合でも、コードを読み取る必要があるので、線形テキストを取得してスパゲッティを配線するにはどうすればよいでしょうか。 任意のヒントをいただければ幸いです。 const obj1 = { a:1, b:2, c:3, d:3 }; const obj2 = { a:1, b:1, …

1
Reduxの原則をOO言語に適用することには意味がありますか?
Reduxは本質的に関数型プログラミングであり、それは非常に理にかなっています。別のプロジェクトで非JavaScript OOP言語に戻ると、単一の状態オブジェクト、その状態の一部に作用するレデューサー、状態を変更するセマンティックアクションのビジネスレイヤーなどの同じ原則を適用したいと思います。 私のプロジェクトはC ++で作成されており、アプリケーションの設計に機能的で、reuxスタイルのアプローチを適用することが理にかなっているかどうかを知りたいです。このアプリではパフォーマンスはそれほど重要ではありませんが、保守性は重要です。 このようにアプリを設計するときにどのような困難に直面しますか? これはGUIアプリではないことを付け加えておきます。さらに考えてみると、アプリケーションの状態の更新による直接的な視覚効果がないため、非GUIアプリケーションでのreduxの利点が減少している可能性があります。

2
関数型言語の2次元ボードゲームのデータ構造
関数型プログラミング言語ElixirでシンプルなMiniMax実装を作成しています。多くの完全な知識のあるゲーム(三目並べ、コネクトフォー、チェッカー、チェスなど)があるため、この実装は、これらのゲームのゲームAIを作成するためのフレームワークになる可能性があります。 しかし、私が直面している問題の1つは、関数型言語でゲームの状態を適切に保存する方法です。これらのゲームは、主に次の操作が頻繁に行われる2次元ゲームボードを扱います。 特定のボードの場所の内容を読む 特定のボードの場所の内容を更新する(新しい移動の可能性を返すとき) 現在の場所に接続されている1つまたは複数の場所のコンテンツを考慮する(つまり、次または前の水平、垂直、または対角の場所) 任意の方向に接続された複数の場所のコンテンツを検討します。 ファイル全体、ランク、対角線の内容を考慮します。 ボードを回転またはミラーリングする(既に計算されたものと同じ結果が得られる対称性をチェックするため)。 ほとんどの関数型言語は、多要素データ構造の基本的なビルディングブロックとしてリンクリストとタプルを使用します。しかし、これらは仕事のために非常にひどく作られたようです: リンクされたリストには、O(n)(線形)ルックアップ時間があります。また、ボードを1回スイープして「ボードをスキャンして更新」することはできないため、リストを使用することは非常に非現実的です。 タプルのルックアップ時間はO(1)(一定)です。ただし、ボードを固定サイズのタプルとして表すと、ランク、ファイル、対角線、または他の種類の連続する正方形を反復処理することが非常に難しくなります。また、ElixirとHaskell(どちらも知っている2つの関数型言語)には、タプルのn番目の要素を読み取るための構文がありません。これは、任意のサイズのボードで機能する動的ソリューションを作成することを不可能にします。 Elixirには組み込みのMapデータ構造(およびHaskellにはData.Map)があり、要素へのO(log n)(対数)アクセスを許可します。現在、私はマップを使用し、x, yキーとして位置を表すタプルを使用しています。 これは「うまくいく」が、このようにマップを乱用することは間違っていると感じますが、理由は正確にはわかりません。2次元ゲームボードを関数型プログラミング言語で格納するためのより良い方法を探しています。

3
別の関数から値を取得する関数は純粋と見なされますか?
副作用のない関数を作成するときにデフォルトの変数値を処理する方法を理解しようとしていますが、次のようになっています。 function getDefaultSeparator() { return ':'; } function process(input, separator) { var separator = separator || getDefaultSeparator(); // Use separator in some logic return output; } デフォルトのセパレーターは他の関数で使用され、1つの場所でのみ定義したいと思います。 これが純粋な関数である場合、代わりにグローバルDEFAULT_SEPARATOR定数を使用することとの違いは何ですか?

3
型ベースの不変条件に対する関数型プログラミングの答えは何ですか?
不変条件の概念が複数のプログラミングパラダイムに存在することを知っています。たとえば、ループ不変式は、オブジェクト指向プログラミング、関数型プログラミング、手続き型プログラミングに関連しています。 ただし、OOPにある非常に便利な種類の1つは、特定のタイプのデータの不変条件です。これをタイトルで「型ベースの不変条件」と呼んでいます。たとえば、Fractionタイプが持つかもしれないnumeratorし、denominatorそのGCDは常に1であることを不変で、(すなわち画分が減少した形です)。これを保証できるのは、そのタイプを何らかのカプセル化して、データを自由に設定できないようにすることだけです。その見返りに、削減されているかどうかを確認する必要がないので、等価性チェックなどのアルゴリズムを簡略化できます。 一方、Fractionカプセル化によってこの保証を提供せずに単純に型を宣言した場合、将来、他の誰かがやって来て方法を追加する可能性があるため、分数が減ると仮定してこの型の関数を安全に書くことはできません非還元分数を取得する方法。 一般に、この種の不変条件がないと、次のような結果になる可能性があります。 前提条件を複数の場所でチェック/保証する必要があるため、より複雑なアルゴリズム これらの繰り返される事前条件は同じ根本的な知識を表すため、DRY違反(不変条件が真であること) コンパイル時の保証ではなく、実行時の失敗を通じて事前条件を適用する必要がある だから私の質問は、この種の不変条件に対する関数型プログラミングの答えは何かということです。ほぼ同じことを達成するための機能的慣用的な方法はありますか?または、利点をあまり関連性のないものにする関数型プログラミングの側面はありますか?

1
「フラックス」と純粋な関数型反応プログラミングの間にはどのような関係がありますか?
Fluxは、私が理解している限り、アプリケーションのデータフローを一方向で処理し、状態をプログラムの残りの部分から分離した、読み取り専用の自己完結型の「ストア」で維持する手法です。ビューによって発行され、ディスパッチャーによってディスパッチされる「アクション」。または、要するに-状態を制御する方法。 それが正しい場合、関数型反応型プログラミングとどのように相関しますか?FRPは状態を非常に強力に制御するため、これらは実際に同じ問題を解決する相互に排他的な手法だと思います。したがって、FRPライブラリ(Elmなど)を使用する場合、Fluxはほとんど使用されません。これは正しいです?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.