54

プログラミングのキャリアの初日から、私はオブジェクト指向プログラミングから始めました。しかし、私は他のパラダイムを学ぶことに興味があります(SOで何度も言ったことは良いことですが、時間がありませんでした)。準備ができているだけでなく、時間もあると思うので、F#で関数型プログラミングを開始します。

ただし、設計アプリケーションをはるかに少なく構成する方法がわかりません。私は、オブジェクト指向プログラミングにおけるファイルごとに1つのクラスとクラス名詞/関数動詞のアイデアに慣れています。機能的なアプリケーションをどのように設計および構造化しますか?

4

8 に答える 8

19

SICPを読みます。

また、PDF版もご用意しております。

于 2008-10-10T16:21:02.327 に答える
14

私の最近のブログ エントリをチェックしてみてください:関数型プログラミングはコードの構造にどのように影響しますか?

大まかに言えば、OO 設計方法論は F# プログラムの構造化に依然として非常に役立ちますが、下位レベルに進むにつれて、これが崩壊する (ルールの例外が増える) ことがわかります。物理レベルでは、相互に再帰的な型を同じファイルで定義する必要があるため ( type Class1 = ... andClass2 = ...)、コードの一部は、特定のクラスにバインドされていない「フリー」関数に存在する場合があります (これは、F# の「モジュール」が適していることです)。F# のファイル順序の制約により、プログラム内の型間の依存関係についても批判的に考える必要があります。高レベルの依存関係を解きほぐすには、より多くの作業や思考が必要になる可能性があるため、これは両刃の剣ですが、常に親しみやすい方法で編成されたプログラムを生成します (最も原始的なエンティティが常に最初に来て、コードのファイルでいっぱいのディレクトリを探し始めて「どこから始めればよいか」がわからないのではなく、常に「上から下へ」プログラムを読み、新しいものを 1 つずつ導入してください)。

于 2008-10-10T19:27:37.970 に答える
6

How to Design Programsはすべてこれに関するものです (面倒な長さで、F# の代わりに Scheme を使用しますが、原則は引き継がれます)。簡単に言えば、コードはデータ型を反映しています。このアイデアは昔ながらの「構造化プログラミング」にまでさかのぼります。関数型プログラミングだけがそれについてより明示的で、より洗練されたデータ型を備えています。

于 2008-10-11T07:48:40.347 に答える
5

現代の関数型言語 (つまり、Lisp ではない) はデフォルトで事前にバインドされた多形関数を (効率的に) 使用し、オブジェクト指向は多形関数を配置するための特定の方法にすぎないことを考えると、方法を知っていれば、実際にはそれほど違いはありません。適切にカプセル化されたクラスを設計します。

Lisp は遅延バインディングを使用して同様の効果を実現します。正直なところ、型の構造を明示的に宣言しないことを除けば、大きな違いはありません。

C++ テンプレート関数を使用して広範囲にプログラミングしたことがある場合は、おそらく既にアイデアを持っているでしょう。

いずれにせよ、答えは小さな「クラス」であり、内部状態を変更する代わりに、異なる状態の新しいバージョンを返す必要があります。

于 2008-10-10T16:20:53.980 に答える
2

F# は、大規模な構造化プログラミング (インターフェースなど) のための従来の OO アプローチを提供し、OCaml のような言語で開拓された実験的なアプローチ (ファンクターなど) を提供しようとはしません。

したがって、F# プログラムの大規模な構造化は、基本的に C# プログラムと同じです。

于 2008-10-19T02:25:35.560 に答える
1

関数型プログラミングは確かに別のパラダイムです。おそらく、頭を包み込む最も簡単な方法は、フローチャートを使用して設計をレイアウトすることを主張することです. 各関数は個別であり、継承もポリモーフィズムもありません。データは関数から関数へと渡され、削除、更新、挿入、および新しいデータの作成が行われます。

于 2008-10-10T16:33:58.307 に答える
1

関数型プログラムの構造化について:

オブジェクト指向言語はクラスでコードを構造化しますが、関数型言語はモジュールでコードを構造化します。オブジェクトには状態とメソッドが含まれ、モジュールにはデータ型と関数が含まれます。どちらの場合も、構造単位はデータ型を関連する動作とともにグループ化します。どちらのパラダイムにも、抽象化の障壁を構築して適用するためのツールがあります。

使い慣れた関数型プログラミング言語 (F#、OCaml、Haskell、Scheme) を選択し、その標準ライブラリがどのように構成されているかを詳しく調べることを強くお勧めします。

たとえば、OCaml Stackモジュールを.NET のSystem.Collections.Generic.Stackまたは Java の同様のコレクションと比較してください。

于 2009-09-15T17:44:26.893 に答える
-1

純粋な関数と、それらを構成してより大きな抽象化を構築する方法がすべてです。これは実際には難しい問題であり、堅牢な数学的背景が必要です。幸いなことに、いくつかのパターンがあり、正式で実践的な研究が利用可能です。On Functional and Reactive Domain Modeling Debasish Ghosh は、こ​​のトピックをさらに調査し、純粋な機能パターンを適用するいくつかの実用的なシナリオをまとめています。

Functional and Reactive Domain Modeling では、ドメイン モデルを純粋な関数の観点から考える方法と、それらを構成してより大きな抽象化を構築する方法について説明します。関数型プログラミングの基本から始めて、複雑なドメイン モデルを実装するために知っておく必要がある高度な概念とパターンに徐々に進みます。この本では、代数データ型、型クラス ベースの設計、副作用の分離などの高度な FP パターンを使用して、モデルを読みやすく検証しやすくする方法を示しています。

于 2016-07-04T11:14:20.627 に答える