haskell中的模块名称和路径

时间:2014-12-02 12:18:07

标签: haskell

我有

root / 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’

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

是否无法避免在Stack.hs的代码中指定已包含在其中的目录名称中的编码内容?

如果没有替代方法,这有什么好理由吗?

1 个答案:

答案 0 :(得分:3)

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

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

之后,正如您所观察到的,一切都应该没问题。

我不知道是否有可能不仅从您在文件中提供的名称而且还从文件的位置派生模块名称。 (这就是你所追求的,不是吗?)当然,这应该是一些花哨的预处理,但你可能不想去那里。

那么,那么,为什么会这样呢?不确定,对你来说,它是否是一个很好的理由,但有人可以说这个方案的优势在于,只需将文件移动到另一个目录,你就不会默默地破坏任何客户端代码。相反,在编译移动的文件时,您已经收到错误。

文件位置和模块名称中的冗余允许处理器查找仅具有最小“搜索路径”集的导入模块。此外,它提供了在较大项目上组织源文件的标准。