2012-09-06 14 views
6

私はハスケルの初心者です。 Ratは、integeresや整数の分数の型です。私は、なぜこれをラットのコンストラクタに輸出するのか聞いてみたいのですが? GHCiの中隠蔽コンストラクタ

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 

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からモジュール自体をロードしているからです。 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. 

EXPLANATION

this ghci manual pageを見てください、セクション2.4.5。これは、すべてのモジュールGHCIがコマンドプロンプトに入れられることを説明していますは現在範囲内にあります。可視の識別子は、Haskellのソースファイルで表示されるものとまったく同じものであり、インポート宣言なし(引用)です。

ghciにロードするように指示したため、コマンドプロンプトにRatNumと表示されるため、プロンプトはそのモジュールと同じスコープで動作します。 私の例では、実際にロードしたモジュールによって参照されたのはMainなので、RatNumのスコープには入っていませんでした。

実際にコードをコンパイル(またはimportで参照)する場合、エクスポート宣言は期待通りに機能します。

+0

これはMain.hsの読み込みに失敗し、RatNumを読み込み、コンストラクターが再び存在します。または私は何かを逃していますか?そして、このエラーについては何ですか? –

+0

このエラーを意味します Main.hs:5:5:範囲外:データコンストラクタ「Only」 –

+1

それがポイントです。予想外のことですが、モジュールの外側からコンストラクタにアクセスすることはできないため、失敗します。 –

関連する問題