top page > computer > haskell > web_lecture > for_programmer > make_module.html
更新日:
文責: 重城良国

構文: モジュールの作成

デフォルトはモジュールMain

空のファイルを作成しそれを対話環境に読みこむ。

% touch some.hs
% ghci some.hs
*Main>

指定がなければMainモジュールとなる。

明示的に

明示的にMainモジュールであることを記述する。

module Main where

a, b, c :: Int
a = 3
b = 4
c = 5

モジュールSome

モジュール名をMainではなくSomeにする。Mainモジュール以外ではモジュール名とファイル名は合わせておく。

% cat Some.hs
module Some where

a, b, c :: Int
a = 3
b = 4 * c
c = 5
% ghci Some.hs
*Some>

モジュールSomeをインポート

モジュールSomeをインポートしてみよう。

import Some

d :: Int
d = a * b

*Some> :load useSome.hs
*Main> d
60

エクスポートリストを明記しない場合

モジュールSomeではエクスポートリストを明記していない。このような場合、このモジュール内で定義された名前がすべてエクスポートされる。

エクスポートリストを明示する

普通はエクスポートリストを明示する。ローカルに使われる補助的な関数や値を公開したくない。

module Some (a, b) where

a, b, c :: Int
a = 3
b = 4 * c
c = 5

インポートした側からは変数cは見えない。

対話環境におけるモジュールの内外の意味

対話環境のモジュール名の前の*は「モジュールのなか」ということだ。

*Main> :load Some.hs
*Some> a
3
*Some> b
20
*Some> c
5
*Some> :m Some
Prelude Some> a
3
Prelude Some> b
20
Prelude Some> c

<interactive>:X:Y: Not in scope: `c'

*Someで表されるモジュールSomeのなかでは変数cにアクセスできる。SomeのようにモジュールSomeのそとでは公開されていない変数cにはアクセスできない。またSomeのなかではPreludeの関数が使える。しかしSomeのそとではPreludeをインポートする必要がある。よってPrelude Someのように複数のモジュールをインポートした形となる。

まとめ

モジュールの作成方法を学んだ。module モジュール名 whereの形で指定する。指定がないときは暗黙のうちにモジュール名はMainとなる。Mainモジュール以外ではエクスポートリストは明示したほうが良い。

課題

  1. モジュールNumbersを定義せよ
  2. モジュールNumbersのなかで整数値one, two, threeを定義せよ
  3. 整数値eightをtwo ^ threeで定義せよ
  4. エクスポートリストで明示的にoneとeightだけを指定せよ
  5. 対話環境で読みこみまずはone, two, three, eightのすべてにアクセスできることを確認せよ
  6. :m Numbersとしてtwoとthreeにはアクセスできないことを確認せよ

「構文: 代数的データ型のインポート」へもどる 「構文: 代数的データ型のエクスポート」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics