F#の名前空間とモジュールの違いは何ですか?


85

F#の学習を始めたばかりです(.NETの使用経験はほとんどありません)。おそらく非常に単純な質問です。F#の名前空間とモジュールの違いは何ですか?

ありがとう

デイブ

編集:答えをありがとうブライアン。それが私が知りたかったことです。明確化:名前空間も開くことができますか(C#usingステートメントと同様)?


4
また、SystemのようにF#で名前空間を開くと、そのサブ名前空間にもアクセスできることに注意してください。したがって、C#では、Systemを開いた場合でも、「System.IO.File」と記述する必要があります。F#では、「IO.File」と書くことができます。これにより、コードがはるかに優れたものになると思います。
MichaelGG 2009

回答:


93

名前空間は.Netのものであり、多くの産業用言語で一般的であり、フレームワークを編成し、異なるライブラリ間の名前の競合を回避するための単なる方法です。あなたと私はどちらもタイプ「Foo」を定義し、それらが異なる名前空間(NS1.FooとNS2.Fooなど)にある場合は、プロジェクトで両方を使用できます。.Netの名前空間には型が含まれています。

モジュールはF#のものであり、「静的クラス」にほぼ類似しています...それは、タイプだけでなく、let-bound値と関数を保持できるエンティティです(名前空間に値/関数、名前空間を直接含めることはできないことに注意してください)タイプのみを含めることができ、タイプ自体に値と関数を含めることができます)。モジュール内のものは、名前空間の場合と同じ構文である「ModuleName.Thing」を介して参照できますが、F#のモジュールを「開いて」、非修飾アクセスを許可することもできます。

open ModuleName
...
Thing  // rather than ModuleName.Thing

(編集:名前空間も同様に開くことができますが、モジュールに値と関数を含めることができるという事実により、モジュールを開くことがより「興味深い」ものになります。たとえば、「cos」などの値と関数を使用できる名前になります。直接ですが、他の.Net言語では、通常は常に修飾する必要があります(例: "Math.cos")。

F#の「トップレベル」でコードを入力すると、このコードは暗黙的にモジュールに入ります。

それがいくらか役立つことを願っています、それはかなり自由形式の質問です。:)


それは完全に正しいわけではありません。モジュールはC#にも存在しますが、そうではありませんか?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird

1
さて、.NETのものであるnetmoduleがあり、F#のものであるF#モジュールがあります、そして私はVBがおそらくモジュール構造を持っていると思います、そしてクラスは一般的なソフトウェアエンジニアリングの意味で「モジュール」です...しかし、最初の質問はF#モジュールに関するものでした。
ブライアン

1
ここには、アセンブリとネットモジュールの関係を説明するすばらしいリンクがあります。1つのアセンブリに、2つの異なる言語で記述された2つのネットモジュールを含めることができます。
ダリウス

2
#6 Cで「静的を使用して」似ている
ブルーノ・ガルシア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.