私はちょっとした Haskell コンパイラを書いていて、できるだけ多くの Haskell 2010 を実装したいと思っています。私のコンパイラはモジュールを解析できますが、モジュールをプログラムに完成させるのは簡単ではないようです。トリッキーですが、おそらく有効な Haskell モジュールの例をいくつか作成しました。
module F(G.x) where
import F as G
x = 2
ここで、モジュールは をFエクスポートしますG.xがG.x、 と同じF.xであるため、モジュールは をFエクスポートxする場合にのみエクスポートしxます。
module A(a) where
import B(a)
a = 2
module B(a) where
import A(a)
この例では、モジュールのエクスポートを解決するためにA、コンパイラはaimport fromBが宣言された と同じかどうかをチェックする必要がありますa = 2が、Bexportsのa場合にのみAエクスポートしaます。
module A(f) where
import B(f)
module B(f) where
import A(f)
module の解決中Aに、コンパイラは import ffromが存在すると想定し、 exportsがimportおよび exportできることBを暗示している可能性があります。唯一の問題は、どこにも定義されていないことです:)。AfBA(f)ff
module A(module X) where
import A as X
import B as X
import C as X
a = 2
module B(module C, C.b) where
import C
b = 3
module C(module C)
import B as C
c = 4
ここで、moduleエクスポートにより、エクスポート リストが相互に依存し、それ自体に依存します。
Haskell 2010 仕様で定義されているように、これらの例はすべて有効な Haskell である必要があります。
Haskellモジュールを正しく完全に実装する方法について何か考えがあるかどうか尋ねたいですか?
モジュールに (単純な) 変数バインディングimports (おそらくasまたはを含む) だけが含まれqualified、修飾された可能性のある変数とmodule ...略語のリストをエクスポートすると仮定します。アルゴリズムは、次のことができる必要があります。
- 各モジュールのエクスポートされた変数の有限リストを計算する
- エクスポートされたすべての変数をそのバインディングにリンクする
- すべてのモジュールで使用されるすべての (おそらく修飾された) 変数をそのバインディングにリンクします