我在写一个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
从B
进口是一样的声明a = 2
,但B
出口a
,当且仅当A
出口a
。
module A(f) where
import B(f)
module B(f) where
import A(f)
在解析模块A
,编译器may've假设f
从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,由Haskell 2010规范定义。
我想问问是否有任何想法如何正确和完全实现Haskell模块?
假定一个模块只包含(简单)变量绑定,import
S(可能与as
或qualified
),并可能有资格变量的出口列表和module ...
缩写。该算法必须能够:
- 计算每个模块
- 链接每个导出的变量与其结合
- 链路每模块中使用与其结合每(也许合格)可变的出口变量的有限列表
哇,谢谢,我甚至不希望有实际的文件和图书馆针对这个问题:) –