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

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

1
オブジェクト指向コードを機能コードにリファクタリングするために使用できるいくつかのテクニックは何ですか?
JavaScriptとHTML5キャンバスを使用してゲームの一部を開発するのに約20〜40時間費やしました。私が始めたとき、私は何をしているのか全く分かりませんでした。したがって、これは概念実証として始まり、現在は順調に進んでいますが、自動テストはありません。ゲームは複雑になり始めており、自動化されたテストの恩恵を受けることができますが、コードがグローバル状態の変化に依存しているため、実行するのは難しいようです。 JavaScript用の関数型プログラミングライブラリであるUnderscore.jsを使用して、すべてをリファクタリングしたいと思います。私の一部は、関数型プログラミングスタイルとテストを使用して、ゼロから始めるべきだと思っています。しかし、命令型コードを宣言型コードにリファクタリングすることは、より優れた学習体験であり、現在の機能の状態に到達するためのより安全な方法になると思います。 問題は、コードを最終的にどのように見せたいかはわかっていますが、現在のコードをそれに変換する方法がわかりません。私はここの何人かの人々がリファクタリングの本とレガシーコードで効果的に働くことのいくつかのヒントを私に与えることを望んでいます。 たとえば、最初のステップとして、私はグローバルステートの「禁止」について考えています。グローバル変数を使用するすべての関数を取り、代わりにパラメーターとして渡します。 次のステップは、ミューテーションを「禁止」し、常に新しいオブジェクトを返すことです。 任意のアドバイスをいただければ幸いです。これまでにOOコードを取得して、Functionalコードにリファクタリングしたことがありません。

1
「通常の順序」と「名前による呼び出し」は同じものですか?
私は「コンピュータプログラムの構造と解釈」という本を研究しており、セクション1.1.5手続き適用の代替モデルでは、筆者は通常の順序と適用順序の概念を説明しています。 今すぐ、私はコースを取っていコーセラが呼ばれるスカラ座での関数プログラミングの原則をと(本が先に引用してずっと彼もちろんベース)教授マーティン・オーダーズキーが説明の名の下に同じ概念コール名ずつとcall-値渡し。 彼のコースでは、教授Odersky著は、私は私の図書館の本に相談して置換モデルは、ラムダ計算に基づいていると言う関数型プログラミングもののラムダ計算に入門をし、22ページに、著者はApplicativeのため、通常の注文として用語を定義し。興味深いことに、彼の定義では、通常の順序はAlgolの名前による呼び出しと同様に、適用順序はPascalの値による呼び出しと同様であると述べています。 彼の説明で「に似ている」という言葉の使用は、私を疑わせたものです。したがって、私の質問: これら2つの用語は同等ですか、それとも微妙な違いがありますか? 意味を間違える危険を冒すことなく、どちらか一方を交換して使用できますか? 同じことを指すために異なる用語の存在を正当化する理由について、あなたが知っている理由はありますか?

4
良い関数型/おっと/メタプログラミング言語を探しています:[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 6年前休業。 なりたい ネイティブコードの生成// GHCなどでコンパイルできる クロスプラットフォーム(win / linux) 機能的で少しオブジェクト指向 ラムダ、パターンマッチング、タプル、その他の機能的なもの 優れたメタプログラミングサポート インデントと最小ボーダー 静的型付け また、私はMixinのサポートを求めています:) 一部のフレームワークに基づいてWebサイトを構築する可能性もプラスです。 そう、はい、パフォーマンスと安定性が重要です。 私はHaskellを起動しましたが、OCamlがあるため、それについてはまだわかりません。そして、F#の経験があります。しかし、私が知る限り、OCalmは少しOOPであり、時にはそれよりも速い(それについてはよくわかりません)ので、試したことはありません。アーランは、私がについて何も知らない、もありアーランを。そして多分私はもっと何かが足りない..?Python、私はここではpythonについて何も知りません、それは機能的であり、それはoopであり、ミックスインをサポートし、人気があり高速ですが、Pythonはすべての機能的なマジックに対応できるとは本当に思っていません。 このスレッド/トピックは、何も話さない、または言語戦争のようなものであることを知っていますが、私は真剣に、そしてあなたのビジョンを本当に聞きたいと思っています。

2
カレー機能の実際の使用例は?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 2年前休業。 カレー機能の実際の使用例を見つけ、カレーを使用するメリットを得るのに苦労しました。 カレー機能をググると、次のような例がよく見られます let add = x => y => x + y; let add10 = add(10); console.log(add10(20)); この例ではカレーを使用することの価値が本当にわからないのです。 このSO /programming/113780/javascript-curry-what-are-the-practical-applicationsの回答を読んだ後でも、それを使用する利点がわかりません。 たとえば、最高得点の回答はコンバーターの例ですが、別の回答が示すように、その例はカレーなしで書き直すことができます。 私も答えを読みますカレーの利点は何ですか?(議論はjavascriptに限定されていませんが)カリーバージョンはjsで)カリーなしで書き直すことができるという感覚を私はまだ得ています。 それで、誰かが私にJavaScriptでカレーを使用することの「本当の」利点/利点を示すことができますか? ----更新---- 私が得た答えを除いて、私はここでログの例を見つけ、それを使用する利点を示しています。

2
キューを使用して関数を分離する/直接呼び出しを避ける?
関数型プログラミングの初心者向けの質問の種類: 私はリッチヒッキーの講演の筆記録をいくつか読んでいますが、彼の有名な講演のいくつかでは、関数を相互に呼び出す代わりにキューを使用することをお勧めしています。(例:デザイン、構成、パフォーマンス、シンプルで簡単) 私はこれを多くの点で完全に理解していません: 彼はデータをキューに入れ、各機能にそれを使用させることについて話しているのですか?したがって、関数Aが関数Bを呼び出して独自の計算を実行する代わりに、関数Bが出力をキューにスラップし、関数Aがそれを取得するようにしますか?または、代わりに、関数をキューに置き、その後それらをデータに順次適用することについて話しているのです(確かにそうではありません。大規模な変更が含まれるためです。そして、マルチアリティ関数のキューの乗算や、ツリーのようなものですか? ) どうすれば物事が簡単になりますか?私の直感は、キューが一種の状態になるため、この戦略はより複雑になると思います。そして、「他の関数がスキューしてデータをキューの上に置くとどうなるか」を心配する必要があります。 SOの実装に関する質問への1つの答えは、アイデアがさまざまなキューの束を作成していることを示唆しています。したがって、各関数はその出力を独自のキュー(??)に入れます。しかし、それも私を混乱させます。なぜなら、関数を一度実行している場合、その出力を取得し、その名前を(var、atom、big inハッシュテーブルなど)。対照的に、関数が複数回実行されていて、その出力をキューに貼り付けている場合は、再び自分に状態を課しているため、すべてが呼び出される順序を心配する必要があり、ダウンストリーム関数は純粋ではなくなります。等 明らかに私はここでポイントを理解していません。誰かが少し説明できますか?


2
ORMで複雑な計算フィールドを処理する方法
私たちのAPIには、計算された値を持つデータベースから取得した後に(いわば)「装飾」する必要があるいくつかの中心的なデータ型があります。データベースは、CakePHP 3データベースレイヤーから大きく影響を受けたテーブル/エンティティダイナミックに従うORMを介してアクセスされます。テーブルオブジェクトは、データベースと、モデルオブジェクトインスタンスとして行を取り込んで渡すアプリケーションとの間の仲介として使用されます。したがって、データベースからデータを取得してそれらの行を返すだけでなく、返されたデータを実際に使用する前に前処理する必要があります。ここに私が何を意味するかをよりよく説明するために出てきたいくつかのユースケースがあります: オブジェクトには数値があり、ユーザーフレンドリーなラベルに変換されます(通常、これは純粋にクライアントに保持するロジックですが、ビジネスセキュリティ上の理由から、このデータの一部はサーバーにのみ保持する必要があります。エッジケース) オブジェクトには、最後に追加された評価から取得された関連する評価値が必要です このような計算値と保存された値の組み合わせに基づいて、複雑なスケジュールオブジェクトが構築されます 単独では、これらのいずれもmap()、返された結果セットに対する単純な操作で実際にかなり簡単に実行できます。同じことが複数の計算値が必要な場合にも当てはまります。必要に応じて、より多くのマップ操作を実行して、それらのフィールドを計算および追加できます。 とはいえ、このアプローチには2つの大きな欠点があります。 これは、これらの計算された値を操作するすべての場所で後処理の追加の手順を実行する必要があることを意味します。これは特にDRYではありません。 これらの変換の一部は、最初に実行される他の変換に依存しています。それ以外の場合は、操作できるデータがありません。 両方を処理するために、このコードをORMに移動し、ORMを変更して、インターフェイスが(外部で)データベース列を処理するのと同じ方法で計算された仮想フィールドにアクセスできるようにするのが最善のアプローチであると考えていました。内部的には、これらの仮想フィールドを変換関数にマップし、潜在的に必要な依存関係変換を内部的に決定して、2番目の問題を解決することができます。 (余談ですが、これにより、単純なハッシュではなく、返された行が実際のオブジェクトである必要がなくなるかどうか疑問に思っています。現在、各行は、フィールドデータセットが設定された新しいオブジェクトをインスタンス化しますが、すべての計算またはデータの変更はモデルの外に移動され、オブジェクトはプロパティのバッグになります-本質的に、それ自体の内部ロジックを持たないハッシュマップです。これは実際には悪いことではないかもしれません)

2
要求仕様を関数型プログラミングの述語ロジックに変換することは一般的な方法ですか?
最近、Haskellで実装されている小さなプロジェクトに取り組むよう割り当てられました。オブジェクト指向/命令的な背景から来て、コーディングの前に要件/ユーザーストーリーをユースケースとシーケンス図に変換することに慣れています。 しかし、私が割り当てられているHaskellプロジェクトでは、チームはユーザーの要件を述語論理命題/ステートメントに変換することを好みます。セーフティクリティカルなシステムやソフトウェアエンジニアリングの正式な方法でロジックが使用されていることは知っていましたが、日常のプログラミングではそれほどではありませんでした。これはFPレルムで一般的な方法ですか?これについてどこでもっと知ることができますか? 要件を「モデル化」し、述語から「関数」を導き、関数が操作するために必要な型仕様を書き留めるのは自然な方法のようです。しかし、それは実際にどのように行われる/推奨されるのですか、それとも私のチームに固有のものですか? (ここでこの質問をする前に徹底的に検索してみました。「関数型プログラミングの要件仕様」(および異なるキーワードの同義語と組み合わせ)を検索しても、意味のあるものは何もありません。)

1
ループ副作用の関数型プログラミング
関数内にローカル変数またはforループがあることが純粋な関数型プログラミングと見なされないのはなぜか、頭を回そうとしています。 この関数を考えると: int as_int(char *str) { int acc; /* accumulate the partial result */ for (acc = 0; isdigit(*str); str++) { acc = acc * 10 + (*str - '0'); } return acc; } 変数accはどのような状況で副作用になりますか?並行環境でも、関数の呼び出しごとに独自のaccのコピーがあります。そのため、関数型プログラミングで許可されていない理由がよくわかりません。

3
参照の透明性はどのように適用されますか?
FP言語では、同じパラメーターを使用して関数を何度も呼び出すと、同じ結果が繰り返し返されます(つまり、参照透過性)。 しかし、このような関数(疑似コード): function f(a, b) { return a + b + currentDateTime.seconds; } 同じパラメータに対して同じ結果を返すことはありません。 これらのケースはFPでどのように処理されますか? 参照の透明性はどのように適用されますか?それともそうではなく、プログラマが自分で行動するかどうかに依存しますか?

3
Haskellの値/参照セマンティクスのテストの考案
命令型言語では、言語の「値のセマンティクス」または「参照のセマンティクス」の使用に関するプログラミングテストを考案することは簡単です。次のようにしてa(where Vertex {one, two, three :: Integer})の値を確認できます。 a := Vertex 3 4 5 b := a one b := 6 two b := 8 three b := 10 ただし、関数型言語では変数は不変であるため、このテストはそのような言語では機能しません。 私はHaskell(および関数型プログラミング全般)についてほとんど知りませんが、私の理解では、値のセマンティクスを使用しています。Haskellで「refレコード」と「valレコード」を区別するプログラミング実験を考案することは可能ですか?

1
関数型リレーショナルプログラミングと関数型プログラミングの違いは何ですか?
このスレッドとリンクされた論文の両方を読んでも、 FRP(関数型リレーショナルプログラミング)が(FP)関数型プログラミングとどのように異なるのか理解できません。 FRPはFPを増強または置き換えますか?FRPをFP言語のライブラリとして実装できますか?

4
IDと変更可能な永続状態を持つエンティティは、関数型プログラミング言語でどのようにモデル化されますか?
この質問(ピートによって書かれた)への回答では、OOPとFPに関するいくつかの考慮事項があります。特に、FP言語は、同一性と変更可能な状態を持つ(永続的な)オブジェクトのモデリングにはあまり適していないことが推奨されます。 これが本当かどうか、つまり、関数型プログラミング言語でオブジェクトをモデル化する方法を考えていました。Haskellの基本的な知識から、モナドはなんらかの方法で使用できると思いましたが、このトピックについては明確な答えを出すのに十分な知識がありません。 それでは、アイデンティティと変更可能な永続状態を持つエンティティは通常、関数型言語でどのようにモデル化されますか? ここに、私が考えていることを明確にするための詳細をいくつか示します。(1)データベーステーブルからJavaオブジェクトにレコードを読み取る、(2)さまざまな方法でオブジェクトを変更する、(3)変更されたオブジェクトをデータベースに保存できる、典型的なJavaアプリケーションを取り上げます。 これはどのようにしてHaskellに実装されますか?最初にレコードをレコード値(データ定義で定義)に読み込み、この初期値に関数を適用してさまざまな変換を実行し(各中間値は元のレコードの新しい変更されたコピーです)、最終的なレコード値を書き込みますデータベースに。 これで全部ですか?各時点でレコードの1つのコピーのみが有効/アクセス可能であることをどのように確認できますか?同時にアクセスできるように、同じオブジェクトの異なるスナップショットを表す異なる不変の値を使用したくない場合があります。

2
オブジェクト指向ではないパラダイムのためのデザインパターンの本、論文、またはリソース?
機能設計パターンに関するInfoQでこのビデオを視聴した後、オブジェクト指向ではないパラダイムの設計パターンに関するリソースはどこにあるのだろうと思いました。OOの世界(GOFなど)やアーキテクチャ(EoEAAなど)についてはたくさんありますが、関数、ロジック、その他のプログラミングパラダイムについて何があるのか​​はわかりません。何かありますか?ビデオ中のコメントはおそらくそうではないことを示唆しています-誰かがよりよく知っていますか? (ちなみに、デザインパターンとは、言語機能やデータ構造ではなく、リンクされたビデオで説明されているように、アプリケーションを設計するためのより高いレベルのアプローチを意味します)

3
関数型プログラミング言語または論理プログラミング言語、あるいはその両方をもっと使用する必要がありますか?
いくつかのuniコースの一部としてHaskellとPrologを少しプログラムしましたが、それはそれで終わりです。そして、それが業界で使用されるのを見たことがありません(最初から多くの実務経験があったわけではありませんが、それらを知る必要がある広告を見たことがありません)。 では、関数型プログラミング言語やロジックプログラミング言語をもっと頻繁に使用するべきでしょうか?それらを使用するか使用しないことの利点または欠点はありますか?

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