SE情報技術研究会’s blog

http://se-info-tech.connpass.com

2015-12-30 『ふつうのHaskellプログラミング』 もくもく読書会(第10章) の振り返り

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうの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.エンティティ名で使えるようになる