我是Haskell的初学者。 假设Rat是integeres或整数的分数类型。我想问一下,为什么要输出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的构造函数。
答案 0 :(得分:12)
这是因为你正在从ghci加载模块本身。在与Main.hs
:
RatNum.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.
<强>说明强>
查看this ghci manual page,第2.4.5节。它解释了GHCI放入命令提示符的每个模块目前都在范围内;可见标识符正是在没有导入声明(引用)的Haskell源文件中可见的标识符。
您的命令提示符为RatNum
,因为您告诉ghci加载它,因此提示符与该模块中的作用域相同。
在我的示例中,它仅由我实际加载的模块Main
引用,因此我没有进入RatNum
的范围。
当您实际编译(或通过import
s)您的代码时,导出声明将按预期工作。