第6章はモジュールについて。粗結合なモジュールに分けておくのはどの言語でも同じなのかな。
インポート
以下が使い方
-- 普通のインポート import Data.List -- 一部だけインポート import Data.List (nub, sort) -- 除外してインポート import Data.List hiding (nub) -- 名前空間を分けてインポート import qualified Data.Map import qualified Data.Map as Map
ghciでは
:m Data.List Data.Map Data.Set
Solving Problems with Module Functions
モジュールの関数なぞ山ほどあると思うので、個別な解説は省略。
個人的に面白いものだけメモ。
import Data.Char ord 'a' -- 97 chr 97 -- 'a'
前の章でも説明したData.List.foldl'について
import Data.List -- foldl'は遅延評価しない foldl' (+) 0 $ replicate 100000 1
Data.Map
Data.Listにもlookup関数があり、これでリストを走査できる。Mapを使えば辞書を効率的に検索できる。MapはfromList経由でしか作れない。
import qualified Data.Map as Map :t Map.fromList -- Map.fromList :: Ord k => [(k, a)] -> Map k a -- fromListWithは重複したキーが合った時に振る舞いを指定できる :t Map.fromListWith -- Map.fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map.Map k a Map.fromList [(1, "hoge"), (2, "hage"), (3, "fish")] -- fromList [(1, "hoge"), (2, "hage"), (3, "fish")] Map.fromList [(1, "hoge"), (1, "huga")] -- fromList [(1, "huga")] Map.fromListWith (\s1 s2 -> s1 ++ ", " ++ s2) [(1, "hoge"), (1, "huga")] -- fromList [(1, "hoge, huga")]
検索するときはlookupを使う。
:t Map.lookup -- Map.lookup :: Ord k => k -> Map.Map k a -> Maybe a Map.lookup "hoge" mymap -- Just "Tom" Map.lookup "humu" mymap -- Nothing
自作モジュール
MyModule.hsというモジュールを作ったとする。
module MyModule ( laugh , sneeze , weep , fly ) where laugh :: String -> IO() laugh = putStrLn ...
このモジュールをインポートするには先ほどと同様に
import MyModule
とするだけでいい。
例えばこんな感じにフォルダに分けた時は
Geometry ├── Sphere.hs ├── Cube.hs └── Cuboid.hs
module Geometry.Cube (..) import qualified Geometry.Cuboid as Cuboid
から初めて、ディレクトリ構造とモジュールの名前を一致させる。