2015-11-27 14 views
10

私は基本的にはPythonの世界から来て、数日間haskellで遊んでいます。haskellに標準モジュール/名前空間の命名規則はありますか?

hackage/stackageのライブラリの名前空間は、Pythonユーザーとしては最も混乱しました。

たとえば、import scottyのようにScottyモジュールをインポートしますが、haskellはimport Web.Scottyのようにインポートします。

ライブラリをスタックやハッキングにアップロードするハスケラーは、カテゴリの名前空間(たとえばWebLanguage、...)の下にライブラリを置くことをお勧めします。

議論外の依存関係管理の観点から、良いアプローチであろうとなかろうと、このカテゴライズに関する事実上の規則はありますか?

はどのようなコミュニティ同意ガイドあります「 Networkカテゴリの下にライブラリのこれらの種類を入れて、 Webカテゴリまたは Dataカテゴリの下にライブラリのそれらの種類を入れては。」 ?

+3

https://www.haskell.org/cabal/proposal/x138.htmlでは、「各パッケージには、一意のパッケージ名が含まれており、スペースは含まれていません。[...]一意のパッケージ名がどのように渡されるかこの仕様[...]の一部ではありません。 https://wiki.haskell.org/Hierarchical_module_namesもあります – gxtaillon

+0

書面によるガイドがあるかどうかわかりません。私は、ほとんどの開発者が、最も類似したライブラリが見つかる現在のハッカー階層のポイントを選択すると信じています。もちろん、例外が存在する。 'Web'は' Network.Web'でした。 – chi

+0

一部の言語(Javaなど)によって、開発者は 'producer-name.a.b.c'のように別々の名前空間を使用することができます。ハスケルでは、このコンベンションは必ずしも実行されていません。すべてのパッケージは通常、モジュールを既存の階層に移植します。 – chi

答えて

5

パッケージ名、パッケージタグ、およびモジュール名はすべて独立したものです。

パッケージ名は、(他の誰とも衝突しない限り)任意の識別子です。その従来のすべての単語間のハイフンで小文字にする。いくつかのパッケージがファミリーの一部である場合、そのフォーマットは、例えば、 "llvm-base"と家族名が最初に表示されます。 Cabalのマニュアルパッケージによれば、名前には文字、数字、ハイフンを使用できますが、スペースは使用できません。他の句読点についてはわかりませんが、Cabalがそれを許しても、私はそれを避けるでしょう。また、WindowsとLinuxの間のパス名の大文字に関する異なる規則のおかげで、混乱が生じる可能性があります。小文字に固執するのが最善です。

タグは、Hackageのようなサイトが有用なグループにパッケージのリストを整理するのに役立ち、他の意味はありません。

パッケージ内には1つまたは複数のモジュールがあります。これらは、クライアントソースコードがインポートするものです。モジュールは階層的な名前空間に存在します。たとえば、 "parsec"パッケージには、モジュール "Text.Parsec.Combinator"が含まれています。これらのドットはパス名の中でLinuxの "/"に似ていると考えることができます(実際にはソースは "src/Text/Parsec/Combinator.hs"のファイルにあります)。

"Control"、 "Data"、 "Text"、 "System"などのモジュールのプライマリジョブに従って使用できる、いくつかのトップレベルの従来のモジュール名があります。その良いスタイルは、それらを使用するが、義務はありません。モジュール名(例: "Parsec")にパッケージ名が現れるのは、名前の衝突を避けるためだけです。パッケージ名とそれが保持するモジュールとの間に正式な関係はありません。

異なる最上位階層のモジュールを含むパッケージを持つことは可能です。たとえば、 "System.Foo"と "Data.Foo"を含むパッケージがあるとします。

"制御"は、モナドおよび関連するもの、特にモナディックおよび矢印コンバイナに使用されます。しかし、モナドもデータ型であるため、モナド型を「制御」に入れるために別のモジュールに入れる必要はありません。

"データ"はキャッチオールです。不確かな場合は、データに入れます。

「システム」は、オペレーティングシステムの機能、特にポータブルではない可能性のあるものに使用されます。

"テキスト"は、テキストの操作、解析、印刷などに使用されます。おそらく多くの文字列操作のものがここに含まれています。

「グラフィックス」:明らかです。

オプションで、1つのレベルにモジュール名を、次にその下に他のモジュールを持つことができます。 "Text.Parsec"はモジュールであり、 "Text.Parsec.Combinators"もそうですが、Parsecのデザイナーは "Text.Parsec"を含める必要はありませんでした。これが行われると、通常、トップレベルのモジュール(この例では "Text.Parsec")が子モジュールの共通サブセットをエクスポートすることを意味するので、クライアントコードは多くの場合、 "Text.Parsec"家族全員。

関連する問題