不在范围数据构造函数中

时间:2012-11-20 20:47:11

标签: haskell

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

first.hs:

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

second.hs:

module second () where
    import first 

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

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

  

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

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

2 个答案:

答案 0 :(得分:23)

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]

但这很难看,而且由于错误地计算了缩进,可能会出错。

答案 1 :(得分:3)

  • 模块名称以大写字母开头 - Haskell区分大小写
  • 在左边缘排列代码 - 布局在Haskell中非常重要。
  • 括号中的位是导出列表 - 如果要导出所有函数,请将其遗漏,或者将要导出的所有内容放入其中。

First.hs

module First where

type S = SetType
data SetType = S[Integer] 

Second.hs

module Second where
import First