20

我有两个 .hs 文件:一个包含一个新的类型声明,另一个使用它。

首先.hs:

module first () where
    type S = SetType
    data SetType = S[Integer]  

第二个.hs:

module second () where
    import first 

当我运行 second.hs 时,第一个、第二个模块都加载得很好。

但是,当我:type在Haskell平台上写S时,出现如下错误

不在范围内:数据构造函数“S”

注意:每个模块中肯定有一些功能,我只是为了简洁而跳过它

4

2 回答 2

31
module first () where

假设实际上模块名称以大写字母开头,空的导出列表 - ()- 表示模块不导出任何内容,因此定义的内容First不在Second.

完全省略导出列表导出所有顶级绑定,或者在导出列表中列出导出的实体

module First (S, SetType(..)) where

(..)导出也是 的构造函数SetType,没有它,只会导出类型)。

并用作

module Second where

import First

foo :: SetType
foo = S [1 .. 10]

或者,将导入限制为特定类型和构造函数:

module Second where

import First (S, SetType(..))

您还可以缩进顶层,

module Second where

    import First

    foo :: SetType
    foo = S [1 .. 10]

但这很丑,而且很容易因为错误地计算缩进而出错。

于 2012-11-20T20:50:19.317 回答
3
  • 模块名称以大写字母开头 - Haskell 区分大小写
  • 在左边距排列你的代码——布局在 Haskell 中很重要。
  • 括号中的位是导出列表 - 如果您想导出所有功能,请忽略它,或者将您想要导出的所有内容放入其中。

First.hs

module First where

type S = SetType
data SetType = S[Integer] 

Second.hs

module Second where
import First
于 2012-11-20T20:50:29.800 回答