隐藏构造函数

Dar*_*jni 6 haskell module

我是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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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

Ric*_* T. 12

这是因为你从ghci加载模块本身.Main.hs在同一目录中的文件中试用此代码RatNum.hs:

module Main where

import RatNum

f = Only 1
Run Code Online (Sandbox Code Playgroud)

现在尝试Main从ghci 加载:

$ 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.
Run Code Online (Sandbox Code Playgroud)

说明

看看这个ghci手册页,第2.4.5节.它解释了GHCI放入命令提示符的每个模块目前都在范围内; 可见标识符正是那些在没有导入声明(引用)的Haskell源文件中可见的标识符.

您的命令提示符是RatNum因为您告诉ghci加载它,因此提示符在该模块中的作用域内.在我的例子中,它仅由我实际加载的模块引用Main,因此我没有进入范围RatNum.

当您实际编译(或引用imports)代码时,导出声明将按预期工作.