これは言語に依存すると思われます。関数型プログラミングに関しては、私はほとんどHaskellに手を出したことがあるので、そこでどのように機能するかを説明します。
Haskellコードは、基本的に関数とデータ型の単なるコレクションである「モジュール」に編成されます。各モジュールは単一のファイルです。モジュールは、JavaクラスとJavaパッケージの混合物です。モジュールが行うことの正確な範囲は異なります。モジュールは、エクスポートする関数と型コンストラクター、および非表示にする関数と型コンストラクターも制御します。これは、Java private
と似ていpublic
ます。
私自身のプログラムでは、モジュールにセマンティックに1つのことをさせたいのです。これにより、複数のデータ型を定義できる点を除き、Javaクラスのようになります。のような標準ライブラリから使用するモジュールはData.List
、パッケージのようなものです。これらは、同様のユーティリティ関数のセットを提供します。これは、などの静的Javaクラスにも非常に似ていますjava.util.Arrays
。
モジュールは、明確にするためにネストできるという点でもJavaパッケージに似ています(これがコード自体に影響を与えるとは思いません)。一般に、1つのプロジェクトに対して、名前を付け(たとえばProject
)、すべてのモジュールをこれに含めます(たとえばProject.Parse
およびProject.Run
)。私は、アプリケーションよりも多くのライブラリのようなものだったのコードを書いていた場合、私はそれはそれはのように、何をしていたかに基づいて整理するでしょうData.List
かControl.Monad
。他の言語との大きな違いの1つは、HaskellがIOを制限し、すべてを1か所に配置することを推奨していることです。多数のモジュールはまったくIOを実行しません。また、どのプロジェクトでも、できるだけ多くのモジュールを純粋にしたいのです。
例として、私はTPLを呼び出す単純なプログラミング言語に取り組んでいます(理由はありません)。このために、2つの単純なモジュールを作成しましTPL.Parse
た。言語の内部表現とその解析方法を定義し、インターTPL.Run
プリターを実行して変数とIOを処理します。実際にコードをコンパイルして実行するために、一般Main
にプログラムのエントリポイントになるモジュールがあります。
ファイル内で関数を整理することには大きな自由があります。これは私がやりたいことです。他の場所で使用する前に、データ型を上部に向かって定義します。データ型を定義した直後に、それらを適切な型クラスの一部にするために必要なものを実装します。これは、インターフェースを実装するようなものです。次に、必要に応じてロジックとさまざまなヘルパー関数を使用します。最後に、すべてのIO関数をで終わる一番下に配置するのが好きmain
です。これにより、IOの実行内容とプログラムの開始場所が明確になります。
したがって、要約すると、関数はモジュールに含まれており、各モジュールは単一のファイルで構成されています。複数のモジュールでプログラムまたはライブラリを構成できます。前者には通常Main
、エントリポイントであるモジュールが含まれます。ファイル内には、組織化のためのさまざまなオプションがありますが、データ型を上部近くに、IOを下部近くに、ロジックを中央にグループ化することを好みます。
What's stopping you from...
Haskellのコードが精神的に計算しないという点まで、まったく異なる考え方での長年にわたるプログラミング。そしてもちろん、実際のプロジェクトは常に正しく、きちんと組織化されていると仮定しています(たぶんそうですが、私のような