2012-09-06 249 views
6

我是Haskell的初學者。讓我們假設鼠是整數的分數類型或整數。我想問一下,爲什麼出口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 

該模塊還沒有完成,我想隱藏鼠的構造函數。

+0

爲了記錄,您正在做什麼可在['Data.Ratio'](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio。 HTML)模塊已經。 –

回答

12

這是因爲你正在從ghci加載模塊本身。在同一目錄中嘗試這個代碼,在一個文件Main.hsRatNum.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引用)您的代碼時,導出聲明將按預期工作。

+0

這將無法加載Main.hs並加載RatNum,並且構造函數會再次出現。或者我錯過了什麼?這個錯誤是關於什麼的? –

+0

我的意思是這個錯誤 Main.hs:5:5:不在範圍內:數據構造函數'Only' –

+1

這就是要點。它會失敗,因爲正如你所期望的那樣,你不能從模塊外部訪問構造函數。 –

相關問題