模块的名称和路径在Haskell

问题描述:

模块的名称和路径在Haskell

根/ Main.hs:

import ADT.Stack 

main :: IO() 
main = 
    putStrLn "Hi" 

根/ ADT/Stack.hs

module Stack (Stack, empty, isEmpty, push, top, pop) where 
... 

在装载Main.hs,我有错误

File name does not match module name: … 
    Saw: ‘Stack’ 
    Expected: ‘ADT.Stack’ 

如果我将模块名称更改为ADT.Sta在Stack.hs中,我可以摆脱错误。 但是,我不明白这种约束背后的原因。

有没有办法避免在Stack.hs的代码中指定什么已经编码在它所在的目录的名称中?

如果没有其他方法,这有什么好的理由吗?

如果您使用分层名称空间,则模块名称应反映完整路径。所以,在root/ADT/Stack.hs,你应该有

module ADT.Stack (Stack, empty, isEmpty, push, top, pop) where 

之后,正如你所观察到的,一切都应该罚款。

我不知道有任何可能性,不仅从您在文件中给出的名称派生模块名称,而且还在文件的位置。 (这就是你以后的事,不是吗?)当然,这应该可以用一些奇特的预处理,但你可能不想去那里。

那么,为什么他们是这样的?不知道对你来说它是否有资格成为一个很好的理由,但有人可能会争辩说,该方案的优势在于,只需将文件移动到另一个目录,就不会以任何方式破坏任何客户端代码。相反,在编译移动的文件时您已经出现错误。

文件位置和模块名称中的冗余允许处理器仅使用最少的一组“搜索路径”来查找导入的模块。此外,它还提供了一个用于组织大型项目的源文件的标准。

+0

有趣的是,你的意见作为haskeller。为了完整起见,谢谢 – nicolas 2014-12-02 13:22:46

+0

,我不确定我是否同意你提到的好处。它的代价是:如果你将你的文件从一个目录移动到另一个目录,不仅你必须改变客户端可以找到文件的位置,这是可以的,但是你也必须自己改变文件的内容!我没有太多练习,但感觉不对。我发现Agda在这方面更直接(没有多余的编码,简单的惯例..) – nicolas 2014-12-03 10:44:19