2015-12-30 『ふつうのHaskellプログラミング』 もくもく読書会(第10章) の振り返り
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/10/05
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る
第10章 モジュール
モジュールの基本概念
- モジュールとは関数や型などの定義をまとめるために使われるもの
- 名前空間がモジュールごとにわかれている
- すべてのモジュールはPreludeモジュールをインポートしている
→ Preludeモジュールのインポート宣言は不要
モジュールの定義とエクスポート
モジュールの宣言
module モジュール名 where …インポートや変数の宣言やクラスメソッドの宣言などなど
- モジュール名はアルファベットの大文字で始まり、「.」でつなげれる
- 下記の記述でエクスポートするクラスメソッドを限定できる
module モジュール名 (クラスメソッド, クラスメソッド, …略) where
次の型があったとする(本の例より)
data SomeType = ConsA String | ConsB Int
これをエクスポートできるようにするには下記のようにする
module AnyModule (SomeType(ConsA, ConsB) ) where
- ConsBをエクスポートせずConsAのみエクスポートするなら
(SomeType(ConsA))
- 全ての型コンストラクタをエクスポートするなら
SomeType(..)
- モジュールがインポートした別のモジュールを
(module インポートしたモジュール名)
とすることで再エクスポートすることも可能
例(本より):
module LineParser (module Text.ParserCombinators.Parsec.Prim, LineParser, indented, blank, firstChar, anyLine) where import Text.ParserCombinators.Parsec.Prim
Mainモジュール
- module宣言するとMainモジュールになる
- 下記のようなmodule宣言が暗黙のうちに定義されている
module Main (main) where
インポート
- import宣言はmodule宣言の後にまとめて書かなくてはならない
- import宣言がモジュール名のみだとそのモジュールがエクスポートしてる全てのものがインポートされる
- 次のように書くことでインポートする内容を制限できる
import Text.Regex (mkRegex, matchRegex)
- 型君巣トラクタをインポートする場合は、エクスポートと同様に型コンストラクタが必要
hiding (対象, 対象)
をつけると対象のものはインポートされない- hidingは予約語ではないので関数名で使うことも可能
- Preludeに対してもhidingは有効
- qualifiedをつけるとインポートしたモジュールのエンティティは完全修飾名でないと使えない
- インポートでas構文をつかうと完全修飾名が変えれる
例(本より):
importb qualified Distribution.Simple.GHCPackageConfig as Conf
上記の場合、Conf.エンティティ名
で使えるようになる