Haskell 隐藏构造函数

Haskell 隐藏构造函数,haskell,module,Haskell,Module,我是哈斯克尔的初学者。 假设Rat是整数或整数的分数类型。我想问,为什么导出这个Rat的构造函数 module RatNum(Rat,add1Rat,makeRat) where infixl 5 :/ data Rat = Int :/ Int | Only Int deriving(Show) add1Rat :: Rat -> Rat add1Rat (a :/ b) = (a+b) :/ b add1Rat (Only a) = Only (

我是哈斯克尔的初学者。 假设Rat是整数或整数的分数类型。我想问,为什么导出这个Rat的构造函数

module RatNum(Rat,add1Rat,makeRat) where
    infixl 5 :/
    data Rat = Int :/ Int | Only Int deriving(Show)
    add1Rat :: Rat -> Rat
    add1Rat (a :/ b) = (a+b) :/ b
    add1Rat (Only a) = Only (a+1)
    makeRat :: Rat
    makeRat = 1 :/ 1
    makeORat :: Rat
    makeORat = Only 1
在GHCI中:

Prelude> :l RatNum
[1 of 1] Compiling RatNum           ( RatNum.hs, interpreted )
Ok, modules loaded: RatNum.
*RatNum> Only 5
Only 5
*RatNum> add1Rat (1:/3)
4 :/ 3
*RatNum> 7:/5
7 :/ 5

模块尚未完成,我想隐藏Rat的构造函数。

这是因为您正在从ghci加载模块本身。在与
RatNum.hs
相同目录下的文件
Main.hs
中尝试此代码:

module Main where

import RatNum

f = Only 1
现在尝试从ghci加载
Main

$ ghci Main.hs
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 2] Compiling RatNum           ( RatNum.hs, interpreted )
[2 of 2] Compiling Main             ( Main.hs, interpreted )

Main.hs:5:5: Not in scope: data constructor `Only'
Failed, modules loaded: RatNum.
解释

请参阅第2.4.5节。它解释了GHCI放入命令提示符的每个模块当前都在范围内;可见标识符正是那些在没有导入声明(cite)的Haskell源文件中可见的标识符

您的命令提示符显示为
RatNum
,因为您告诉ghci加载它,因此提示符的作用域与该模块内的作用域相同。 在我的示例中,它只被我实际加载的模块
Main
引用,因此我没有进入
RatNum
的范围


当您实际编译(或通过
import
s引用)您的代码时,导出声明将如您所期望的那样工作。

对于记录,您所做的操作已经在模块中可用。这将无法加载Main.hs和loads RatNum,并且构造函数再次出现。还是我遗漏了什么?这个错误是关于什么的?我指的是这个错误。hs:5:5:不在范围内:数据构造函数‘仅’这是重点。它失败是因为,正如您所期望的,您无法从模块外部访问构造函数。对不起,我现在明白了。谢谢你的回答,我是否必须解决这个问题或sg?如果我完全回答了你的问题,那么你应该点击“v”标志将我的回答标记为接受。谢谢:)