Download - Haskell 6-module

Transcript

第6章モジュール

すごいH本

Haskellのモジュール

 = いくつかの関数や型、型クラスを

   定義したファイル。

Haskellのプログラム

 = モジュールの集合。

エクスポート

 = モジュールの中身を外の世界から

   見えて、使えるようにすること。

インポート

 = モジュールを利用するための

   おまじない。

モジュールに分割する利点

1)汎用的なモノはいろんな所で使える

2)疎結合することで再利用がしやすい

3)管理がしやすい

モジュールをインポートする

 = import ModuleName #関数定義よりも前に書く(通常はファイルの先頭)

複数のモジュールをインポートする

 = import ModuleName1

   import ModuleName2

   …

例:Data.Listモジュールのインポート

import Data.List

numUniques :: (Eq a) => [a] -> Int

numUniques = length . nub #(関数合成版)

numUniques xs = length (nub xs) #(通常版)

numUniques = \xs -> length (nub xs) #(λ版)

モジュールをGHCiでインポートする

 ghci> :m + Data.List

複数のモジュールをGHCiでインポートする

 ghci> :m + Data.List Data.map Data.Set

特定の関数をインポートする

 = import Data.List (nub, sort)

特定の関数以外をインポートする #名前の競合を避けるためなど・・・

 = import Data.List hiding (nub)

名前競合を避けるもう一つの方法

 = 修飾付きインポート

   (qualifiedインポート)

例:Data.Map.filterの利用

 #Prelude.filterと名前競合

 = import qualified Data.Map

   Data.Map.filter ...

もっと簡単に

 = import qualified Data.Map as M

   M.filter ...

修飾付きインポートと関数合成の見分け方

インポートされた関数

 = qualifiedされたモジュール.関数名       #空白を開けない↑

関数合成

 = 上記以外

モジュールを作ってみよう

例:幾何学オブジェクトの体積と  面積を計算するモジュール

1.ファイルを作成する

  Geometry.hsを作成

例:幾何学オブジェクトの体積と  面積を計算するモジュール

2.モジュールの先頭でモジュール名を指定する

  #ファイル名に従ったモジュール名を指定

  Geometry.hs -> module Geometry

例:幾何学オブジェクトの体積と  面積を計算するモジュール

3.モジュールがエクスポートする関数を指定する

   module Geometry

(sphereVolume,

...

)where

例:幾何学オブジェクトの体積と  面積を計算するモジュール

4.関数を追加する

  module Geometry

(sphereVolume,

...

)where

  sphereVolume :: Float -> Float

sphereVolume = (4.0/3.0) * pi * (radius ^ 3)

階層的モジュール

モジュールは階層構造を持つこともできる

 ー> 例:幾何学モジュールの分割

分割されたモジュールを作ってみよう

例:幾何学オブジェクトの体積と  面積を計算する分割されたモジュール

1.フォルダを作成する

  Geometryを作成

例:幾何学オブジェクトの体積と  面積を計算する分割されたモジュール

2.ファイルを作成する

  ・Sphere.hsを作成

  ・Cuboid.hsを作成

  ・Cube.hsを作成

例:幾何学オブジェクトの体積と  面積を計算する分割されたモジュール

3.モジュールの先頭でモジュール名を指定する  #フォルダ名とファイル名に従った  #モジュール名を指定

  Geometry/Sphere.hs

-> module Geometry.Sphere

例:幾何学オブジェクトの体積と  面積を計算するモジュール

3.モジュールがエクスポートする関数を指定する

   module Geometry.Sphere

(volume,

area

)where

例:幾何学オブジェクトの体積と  面積を計算するモジュール

4.関数を追加する

  module Geometry.Sphere

(Volume,

area

)where

  Volume :: Float -> Float

Volume = (4.0/3.0) * pi * (radius ^ 3)

モジュールは階層構造を持つこともできる

 ・モジュールに分けることで、

  同じ名前の関数を定義することが可能

  Geometry.Sphere.volume

  Geometry.Cuboid.volume

  Geometry.Cube.volume

まとめ

Haskellのプログラムはモジュールの集合

モジュールはいくつかの関数や型、型クラスを定義したファイル

モジュールに分割する利点1)汎用的なモノはいろんな所で使える2)疎結合することで再利用がしやすい3)管理がしやすい

モジュールはインポートして利用する

モジュールは自作することができる


Top Related