2017-06-05 11 views
4

https://facebook.github.io/reason/modules.html#modules-basic-modules理由モジュールシステム

I don’t see any import or require in my file; how does module resolution work? 

Reason/OCaml doesn’t require you to write any import; modules being referred to in the file are automatically searched in the project. Specifically, a module Hello asks the compiler to look for the file hello.re or hello.ml (and their corresponding interface file, hello.rei or hello.mli, if available). 
A module name is the file name, capitalized. It has to be unique per project; this abstracts away the file system and allows you to move files around without changing code. 

私は、理由のモジュールシステムを試みたが、それがどのように動作するかを理解することはできません。

1)openincludeの違いは何ですか?

2)ファイルfoo.reと定義済みモジュールFooがあります。私はファイルbar.reを持っており、モジュールFooから関数を呼びたいと思っています。

openまたはincludeモジュールFoobar.re?または直接アクセス - Foo.someFunction

3)モジュールインターフェイスは、*.reiファイルのみを実装する必要がありますか?そして、モジュールインタフェースファイルは同じ名前でなければなりませんが、rei ext?

答えて

9

1)openは、importのように、開いたモジュールのエクスポートされた定義をローカル名前空間に追加します。 includeは、インクルードされたモジュールからインクルードに定義をコピーしたかのように、それらをモジュールに追加します。 ìncludeはまた、(もちろんエクスポートされたものを制限するインターフェースファイル/シグネチャがない限り)定義をエクスポートするでしょう。

2)名前空間を不必要に汚染しないように、モジュールの最もローカルな使い方を好むべきです。したがって、一般的には直接アクセスを使用したいと思うでしょう。モジュールがファイルレベルで開かれるように特別に設計されている場合にのみ、そうするべきです。しかし、ファイルレベルよりもローカルな形式のopenがあります。あなたがopenできる機能のほんの範囲内のモジュールは、あるいはFoo.(someFunction 4 |> otherFunction 2)の形で単一の式にスコープ

3)トップレベル(ファイル)のモジュールが同じ名前を持つreiファイルの形で実装する必要がありますファイルはreです。ただし、モジュールタイプをサブモジュールの「インタフェース」として定義できます。

OCamlのモジュールシステムは非常に広範囲で柔軟性があります。私は、Real World Ocamlのモジュールの章を読んで、より良い理解を得ることをお勧めします:https://realworldocaml.org/v1/en/html/files-modules-and-programs.html

関連する問題