私はちょっとした 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
、コンパイラはa
import fromB
が宣言された と同じかどうかをチェックする必要がありますa = 2
が、B
exportsのa
場合にのみA
エクスポートしa
ます。
module A(f) where
import B(f)
module B(f) where
import A(f)
module の解決中A
に、コンパイラは import f
fromが存在すると想定し、 exportsがimportおよび exportできることB
を暗示している可能性があります。唯一の問題は、どこにも定義されていないことです:)。A
f
B
A(f)
f
f
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モジュールを正しく完全に実装する方法について何か考えがあるかどうか尋ねたいですか?
モジュールに (単純な) 変数バインディングimport
s (おそらくas
またはを含む) だけが含まれqualified
、修飾された可能性のある変数とmodule ...
略語のリストをエクスポートすると仮定します。アルゴリズムは、次のことができる必要があります。
- 各モジュールのエクスポートされた変数の有限リストを計算する
- エクスポートされたすべての変数をそのバインディングにリンクする
- すべてのモジュールで使用されるすべての (おそらく修飾された) 変数をそのバインディングにリンクします