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

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

1
HaskellのMaybeコンストラクターを「Just」と呼ぶことをサポートする直観は何ですか?
のようなオプションの型の直感は、Int Maybe Intがない(つまり、そこにNothingある)か、Int があるということです。そこに何かがあります。 それは私たちが「負」の場合の型コンストラクタを呼び出すように私には理にかなってNothing何もありませんということ-それは正確にすることを意味するので、Intそこに。しかし、なぜ実際にそこにある何かに重点が置かれている場合にだけ、単語を使用するのですか? 私にとって、「Just」という言葉には、説明しているものが代替品よりも少ないという意味が含まれています。実際にそこにある何かの反対。例えば、 A:今夜何かしますか? B:いいえ。私はただ滞在してテレビを見ます。 A:あなたの家の周りの不気味な幽霊の音を調査しましたか? B:ええ、実際には単なるフクロウでした。 明らかに、この命名の選択の根拠となった直感が欠けています。それは何ですか?私にとって、「Just」という言葉は、Maybeタイプでの使用方法の反対を意味します。

2
すべての主要なOOP機能を失うことなく、OOPで不変性を本当に使用できますか?
私のプログラムでオブジェクトを不変にすることの利点を理解しています。アプリケーションの良い設計について本当に深く考えているとき、私は多くの場合、オブジェクトの多くが不変であることに自然に到達します。多くの場合、すべてのオブジェクトを不変にしたいところになります。 この質問は同じ考えを扱っていますが、不変性に対する優れたアプローチと、それを実際に使用するタイミングを示唆する答えはありません。いくつかの良い不変のデザインパターンがありますか?一般的な考え方は、「オブジェクトを変更する必要が絶対にない限り、オブジェクトを不変にする」ことであるように見えますが、実際には役に立ちません。 私の経験では、不変性はコードをますます機能的なパラダイムに追い込み、この進行は常に起こります。 リスト、マップなどの永続的な(機能的な意味での)データ構造が必要になります。 相互参照(たとえば、子が親を参照している間、子を参照しているツリーノード)で作業することは非常に不便です。 継承は意味をなさないために停止し、代わりに構成を使用し始めます。 カプセル化のようなOOPの基本的な考え方全体がバラバラになり始め、私のオブジェクトは関数のように見え始めます。 この時点で、私は実際にはOOPパラダイムの何も使用しておらず、純粋に機能的な言語に切り替えることができます。したがって、私の質問:良い不変のOOP設計への一貫したアプローチがありますか、または不変のアイデアを最大限に活用すると、常にOOPの世界から何も必要としない関数型言語でプログラミングすることになりますか?OOPがバラバラにならないように、どのクラスを不変にし、どのクラスを不変にするかを決定するための良いガイドラインはありますか? 便宜上、例を示します。さんが持ってみましょうChessBoard不変のチェスの駒の不変なコレクションとして(抽象クラスを拡張しますPiece)。OOPの観点から見ると、ピースはボード上の位置から有効な動きを生成する役割を果たします。しかし、動きを生成するには、ピースがそのボードへの参照を必要とする一方で、ボードはそのピースへの参照を必要とします。さて、あなたのOOP言語に応じてこれらの不変の相互参照を作成するためのいくつかのトリックがありますが、それらは管理するのが苦痛で、ボードを参照する部分を持たない方が良いです。しかし、ボードの状態がわからないため、ピースは動きを生成できません。すると、ピースはピースタイプとその位置を保持する単なるデータ構造になります。その後、ポリモーフィック関数を使用して、あらゆる種類のピースの動きを生成できます。これは関数型プログラミングでは完全に達成できますが、ランタイム型チェックやその他の不適切なOOPプラクティスがないOOPではほとんど不可能です...

6
これは非オブジェクト指向でどのようにプログラムされますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 OOPのマイナス面に関する痛烈な記事を読んで、他のパラダイムを支持して、私はあまり過失を見つけることができない例にぶつかった。 私は著者の議論にオープンになりたい、と私は彼らのポイントを理論的に理解することができますが、特に1つの例は、例えばFP言語でそれがより良く実装される方法を想像しようとするのに苦労しています。 From:http : //www.smashcompany.com/technology/object-oriented-programming-is-an-expensive-disaster-which-must-end // Consider the case where “SimpleProductManager” is a child of // “ProductManager”: public class SimpleProductManager implements ProductManager { private List products; public List getProducts() { return products; } public void increasePrice(int percentage) { if (products != null) { for (Product product : …

5
関数型プログラミングでは、数学の法則によってモジュール性をどのように実現しますか?
私はこの質問で、関数型プログラマーは数学的な証明を使用して、プログラムが正しく機能していることを確認する傾向があることを読みました。これは、単体テストよりもずっと簡単で高速に聞こえますが、OOP /単体テストのバックグラウンドから来たので、一度も見たことがないです。 それを私に説明し、例を挙げてもらえますか?

2
Haskellのメモリ効率-より良いアプローチはどれですか?
修正された2次元文法構文に基づいて、マトリックス圧縮ライブラリを実装しています。データ型に対して2つのアプローチがあります-メモリ使用量の場合、どちらが良いでしょうか?(何かを圧縮したい;))。 文法には、プロダクションが4つだけの非ターミナル、または右側にターミナルが含まれています。同等性チェックと文法最小化のためにプロダクションの名前が必要になります。 最初: -- | Type synonym for non-terminal symbols type NonTerminal = String -- | Data type for the right hand side of a production data RightHandSide = DownStep NonTerminal NonTerminal NonTerminal NonTerminal | Terminal Int -- | Data type for a set of productions type ProductionMap = Map …

3
Clojureでネストされた速記関数を記述できないのはなぜですか?
今日、ネストされた速記関数を使用してClojure式を評価しようとしましたが、私はそれを許可しませんでした。 式は次のとおりです。 (#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed 出力は次のとおりです。 IllegalStateException Nested #()s are not allowed clojure.lang.LispReader$FnReader.invoke (LispReader.java:630) ...and a bunch of other garbage

5
関数が純粋かどうかを計算する
ウィキペディアによると: コンピュータープログラミングでは、関数に関するこれらのステートメントの両方が成立する場合、関数は純粋であると説明できます。関数は、同じ引数値が与えられると常に同じ結果値を評価します。関数の結果値は、プログラムの実行が進むにつれて、またはプログラムの異なる実行間で変化する可能性のある隠された情報や状態に依存することも、I / Oデバイスからの外部入力に依存することもできません。結果を評価しても、可変オブジェクトの変更やI / Oデバイスへの出力など、意味的に観察可能な副作用や出力は発生しません。 関数が純粋であるかどうかを計算する関数を書くことができるかどうか疑問に思っています。JavaScriptのコード例: function sum(a,b) { return a+b; } function say(x){ console.log(x); } isPure(sum) // True isPure(say) // False

1
Scalaで関数が明示的な戻り値の型を持つ必要があるのはなぜですか?
私は最近Scalaでプログラムすることを学び始めましたが、これまでのところ楽しかったです。私は、別の関数内で関数を宣言する機能が本当に好きです。 私がScalaについて抱えている問題の1つは、Scalaがその関数に明示的な戻り値の型を必要とするという事実です。そして、これは言語の表現力を妨げると感じています。また、その要件でプログラミングするのは難しいだけです。たぶん、私はJavascriptとRubyのコンフォートゾーンから来たからでしょう。しかし、Scalaのようにアプリケーションに大量の関数が接続されている言語の場合、自分が書いている特定の関数が再帰後に再帰で返されるタイプを正確に頭の中にブレーンストーミングする方法を考えることはできません。 関数の明示的な戻り値型宣言のこの要件は、JavaやC ++などの言語では気になりません。JavaとC ++の再帰は、実際に発生したときに、多くの場合2〜3個の関数で処理されていました。Scalaのように、いくつかの機能が連鎖することはありません。 だから私は、Scalaが明示的な戻り値の型を持つ関数の要件を持たなければならない正当な理由があるのだろうかと思いますか?

3
ScalaまたはClojure関数型プログラミングのベストプラクティス
私は多くの自習用コーディングを行い、アクター、ソフトウェアトランザクションメモリ、データフローなどの並列プログラミングモデルでいくつかの経験を得ました。 これらのアーキテクチャを実際の生活-高負荷Webアプリケーションに適用しようとすると、どのモデルもデータの耐久性と永続性をサポートしません。実際のタスクでは、最後にデータを保存する必要があります。これは、DBを使用し、DB同期をトラップしなければならないこと、スケーラビリティのボトルネックなどの可能性があることを意味します。 Akkaアクターまたはソフトウェアトランザクションメモリを使用し、最後に永続性を実装するアーキテクチャ(srcまたはtextまたはdiagramまたはblueprints)の良い例を知っている人はいますか? 実際のアプリケーションでのトランザクションメモリ、アクター、データフロー、タプルスペースの良い例/アイデアは大歓迎です。

5
24時間降水量のリストを1時間ごとの合計値に変換する
時間ごとの降水量のリストがあり、それぞれが過去24時間に発生した雨の量を日付順に並べたものだとします。例えば: { '2012-05-24 12:00': 0.5, // .5" of rain from 5/23 12:00 - 5/24 11:59 '2012-05-24 11:00': 0.6, // .6" of rain from 5/23 11:00 - 5/24 10:59 '2012-05-24 10:00': 0.6, // .6" of rain from 5/23 10:00 - 5/24 09:59 ... '2012-05-23 10:00': 0 } 各時間に降った雨の量を判断するための戦略/アルゴリズムはありますか?これに頭を包むことはできないようです。私はそれが単に差分を合計するほど簡単ではないことを知っています。 データセットの視覚化 P(N) [.....======================] …

4
「混合」言語での設計:オブジェクト指向設計または関数型プログラミング?
過去数年間で、私が使用したい言語はますます「機能的」になりつつあります。現在、C#、F#、Scalaなどの「ハイブリッド」言語を使用しています。ドメインオブジェクトに対応するクラスを使用してアプリケーションを設計し、これによりコーディングがより簡単に、より正確に、より安全になる機能機能を使用します(特にコレクションの操作時または関数の受け渡し時)。 ただし、パターンを設計する場合、2つの世界は「衝突」します。私が最近直面した具体的な例は、Observerパターンです。アイテムが作成または変更されたときに、プロデューサーに他のコード(「消費者/オブザーバー」、たとえばDBストレージ、ロガーなど)に通知してほしい。 私は最初に次のように「機能的に」それをしました: producer.foo(item => { updateItemInDb(item); insertLog(item) }) // calls the function passed as argument as an item is processed しかし、私は今、もっと「OO」アプローチを使用すべきかどうか疑問に思っています。 interface IItemObserver { onNotify(Item) } class DBObserver : IItemObserver ... class LogObserver: IItemObserver ... producer.addObserver(new DBObserver) producer.addObserver(new LogObserver) producer.foo() //calls observer in a loop 2つのアプローチの長所と短所はどれですか?かつてFPの第一人者が、デザインパターンは言語の制限のためだけにあると言ったことを聞いたことがあり、それが関数型言語にはほとんどない理由です。たぶん、これはその例でしょうか? 編集:私の特定のシナリオでは、私はそれを必要としませんが、..機能的な方法で「観測者」の削除と追加をどのように実装しますか?(つまり、パターンのすべての機能をどのように実装しますか?)たとえば、新しい関数を渡すだけですか?

1
関数型言語のUIパターン
ClojureScriptをいじり始めたいのですが、いくつかの点に困惑しています。私の問題は、機能的に作業しようとするときに、ユーザーの対話から生じる状態の変化に対処するための良い方法です。 いくつか例を挙げましょう。ブラウザーで実行されるアプリケーションを念頭に置いていますが、問題はより一般的だと思います。もちろん、何かが変化します-少なくともDOMです。しかし、不変のデータ構造で動作するように残りのコードを整理する方法を見つけたいと思います。 1)イベントをDOMオブジェクトに添付したいとします。これは主に機能的な方法で行うのは難しくありません。ノードを作成するときに、さまざまなイベントハンドラーでハッシュマップをアタッチします。ただし、イベントの委任を使用している場合を考えてください。次に、新しいノードを作成するときに、おそらく既に存在する親ノードにイベントハンドラーをアタッチできます。そのため、既存のノードに関連付けられているハッシュを変更する必要があります。 2)入力フィールド用のオートコンプリートモジュールを設計しているとします。ユーザーがキーを押すたびに、提案を得るためにサーバーを呼び出すことができます。これは簡単です。しかし、今それを少し最適化したいと思います。一致するすべての結果fooがわかっている場合は、一致するすべての結果を再度要求しても意味がありませんfoobar。前者をフィルタリングできます。そのため、何らかのキャッシュを作成する必要があります。このキャッシュは、ユーザーが以前に入力した単語のスーパーセットではない新しい単語を挿入するたびに更新されます。繰り返しますが、キャッシュをどのようにモデル化するのですか?最も合理的な方法は、単語を結果にマッピングするハッシュマップのようですが、変更可能である必要があります。 ユーザーの操作による変更を機能設計に組み込むのを容易にするいくつかのパターンを提案できますか?

5
関数型プログラミングのデータ構造
私は現在LISP(特にSchemeとClojure)で遊んでいますが、関数型プログラミング言語で典型的なデータ構造がどのように扱われるのか疑問に思っています。 たとえば、グラフパス検索アルゴリズムを使用して問題を解決したいとします。そのグラフを関数型プログラミング言語(主にLISPに適用できる純粋な関数型に興味がある)で表現するにはどうすればよいでしょうか?グラフを完全に忘れて、他の方法で問題を解決できますか?

3
ScalaとLWJGLを使用した簡易ゲームの関数型プログラミングアプローチ
Javaの命令型プログラマであるIは、関数型プログラミングの設計原則(特に参照の透明性)に基づいて、スペースインベーダーの単純なバージョンを生成する方法を理解したいと考えています。しかし、デザインを考えようとするたびに、極端な可変性の泥沼で迷子になります。これは、関数型プログラミングの純粋主義者によって回避される同じ可変性です。 関数型プログラミングを学習する試みとして、LWJGLを使用してScalaで非常にシンプルな2DインタラクティブゲームであるSpace Invader(複数形の欠如に注意)を作成することにしました。基本的なゲームの要件は次のとおりです。 「A」キーと「D」キーでそれぞれ画面の下部にあるユーザーシップを左右に移動しました 発射間隔が0.5秒になるようにスペースバーで起動したユーザー船の弾丸を真っ直ぐ発射 射撃の間に0.5秒から1.5秒のランダムな時間で起動するエイリアン船の弾丸が真下に発射されました 元のゲームから意図的に除外されたものは、画面の上部にあるWxHエイリアン、分解可能な防御バリアx3、高速ソーサー船です。 さて、実際の問題領域に移りましょう。私にとって、決定論的な部分はすべて明らかです。アプローチ方法を検討する私の能力を妨げているのは、非決定的な部分です。決定論的な部分は、弾丸が存在する場合の弾道、エイリアンの連続的な動き、およびプレイヤーの船またはエイリアンのいずれか(または両方)の衝突による爆発です。(私にとって)非決定的な部分は、ユーザー入力のストリームを処理し、エイリアンの弾丸の発射を決定するためのランダムな値のフェッチを処理し、出力(グラフィックとサウンドの両方)を処理します。 私はこの種のゲーム開発を長年にわたって行うことができます(そして、これまでしてきました)。しかし、それはすべて命令型パラダイムからでした。さらに、LWJGLは、スペース侵略者の非常にシンプルなJavaバージョンを提供します(これは、セミコロンなしのJavaとしてScalaを使用してScalaに移行し始めました)。 Java / Imperativeプログラミングから来た人が理解する方法でアイデアを直接扱ったものはいないように思われる、この領域に関するいくつかのリンクを以下に示します。 純粋に機能的なレトロゲーム、パート1ジェームズハーグ 同様のスタックオーバーフローポスト Clojure / Lispゲーム スタックオーバーフローに関するHaskellゲーム Yampaの(Haskellでの)関数型リアクティブプログラミング Clojure / LispとHaskellのゲーム(ソース付き)にはいくつかのアイデアがあるようです。残念ながら、私は単純なJava命令型脳にとって意味のあるメンタルモデルにコードを読み取ったり解釈したりすることはできません。 FPが提供する可能性に非常に興奮しており、マルチスレッドのスケーラビリティ機能を味わうことができます。Space Invaderの時間+イベント+ランダム性モデルのような単純なものをどのように実装し、高度な数学的理論のように感じることなく、適切に設計されたシステムで決定論的部分と非決定論的部分を分離する方法を理解できたと思います; すなわちヤンパ、私は設定されるでしょう。単純なゲームの生成にYampaの理論レベルの学習が必要と思われる場合、必要なすべてのトレーニングと概念フレームワークを取得するためのオーバーヘッドが、FPの利点の理解を大きく上回ります(少なくともこの単純化された学習実験の場合) )。 フィードバック、提案されたモデル、問題領域へのアプローチ方法(ジェームズハーグがカバーしている一般性よりも具体的)をお勧めします。

2
不変データを持つ言語で二重にリンクされたデータ構造または循環データ構造に操作を実装するための回避策
Haskellでグラフを作成してローカル操作を行う方法を学びたいのですが、問題はHaskellに固有のものではなく、グラフの代わりに二重リンクリストを検討することもできます。 質問: 主に不変のデータ構造(Haskell、Clojureなど)をサポートおよび推奨する言語で、二重リンクリスト(または他の二重リンクまたは循環データ構造)とその操作を実装する慣用的または推奨される方法は何ですか? ?特に、言語で正式に禁止されているインプレース更新の使用方法は? 二重にリンクされたリストでローカル操作を実行した場合(アイテムが挿入された場合など)、言語の遅延により、リスト全体をすぐにコピーする必要がない場合があることは容易に想像できます。ただし、リストは二重にリンクされているため、1か所で変更された場合、リストの新しいバージョンで古いノードを使用することはできず、何らかの方法でマーク、コピー、ガベージコレクションを行う必要があります。 。リストの更新されたコピーのみを使用する場合、これらは明らかに冗長な操作ですが、リストのサイズに比例した「オーバーヘッド」が追加されます。 これは、そのようなタスクでは不変データが単に不適切であり、可変データを「ネイティブ」でサポートしていない関数型宣言言語は、命令型言語ほど優れていないことを意味しますか?または、トリッキーな回避策はありますか? PS私はインターネットでこの主題に関するいくつかの記事やプレゼンテーションを見つけましたが、それらをフォローするのに苦労しましたが、この質問への答えは1段落以上、そしておそらく図を取るべきではないと思います...つまり、もしあればこの問題に対する「機能的な」解決策はありません。答えは「Cを使用する」でしょう。ある場合、それはどれほど複雑になる可能性がありますか? 関連する質問 「関数型プログラミングのデータ構造」。非効率的な代替手段の代わりにインプレース更新を使用することについての私の特定の質問はそこでは議論されていません。 「永続的データ構造の内部変異」。ここでは、不特定の言語での低レベルの実装に重点が置かれているようですが、私の質問は、言語(関数型またはその他)の正しい選択と、関数型言語で可能な慣用的な解決策についてです。 関連する引用 純粋に関数型のプログラミング言語では、多くのアルゴリズムを非常に簡潔に表現できますが、その場で更新可能な状態が重要な役割を果たすと思われるアルゴリズムがいくつかあります。これらのアルゴリズムの場合、更新可能な状態がない純粋に関数型の言語は本質的に非効率的であるように見えます([Ponder、McGeer and Ng、1988])。 -John LaunchburyおよびSimon Peyton Jones、レイジー機能状態スレッド(1994)、John LaunchburyおよびSimon Peyton Jones、Haskell州(1995)。これらの論文STでは、Haskellのモナディック型コンストラクタを紹介しています。

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