読者です 読者をやめる 読者になる 読者になる

tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

「Learn You a Haskell for Great Good!」第6章を読んだ

第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

から初めて、ディレクトリ構造とモジュールの名前を一致させる。