7

私はHaskellの初心者です。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 のコンストラクターを非表示にしたいと思います。

4

1 に答える 1

13

これは、モジュール自体をghciからロードしているためです。Main.hs次と同じディレクトリにあるファイルで、このコードを試してくださいRatNum.hs

module Main where

import RatNum

f = Only 1

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.

説明

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

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

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

于 2012-09-06T12:24:23.303 に答える