by shigemk2

当面は技術的なことしか書かない

モジュールの自作

このようにモジュールを自作することが出来る。

-- インポートしたい関数群
-- rectAreaがないことに注意。
-- つまり全ての関数をインポートする必要はない。
module Geometry
       ( sphereVolume,
         sphereArea,
         cubeVolume,
         cubeArea,
         cuboidArea,
         cuboidVolume
       ) where

sphereVolume :: Float -> Float
sphereVolume radius = (4.0 / 3.0) * pi * (radius ^ 3)

sphereArea :: Float -> Float
sphereArea radius = 4 * pi * (radius ^ 2)

cubeVolume :: Float -> Float
cubeVolume side = cuboidVolume side side side

cubeArea :: Float -> Float
cubeArea side = cuboidArea side side side

cuboidVolume :: Float -> Float -> Float -> Float
cuboidVolume a b c = rectArea a b * c

cuboidArea :: Float -> Float -> Float -> Float
cuboidArea a b c = rectArea a b * 2 + rectArea a c * 2 + rectArea c b * 2

rectArea :: Float -> Float -> Float
rectArea a b = a * b

モジュールのインポート

import Geometry

また、階層構造にすることも出来る。
モジュール名を冠したディレクトリを作成する。

Geometry/Cube.hs

module Geometry.Cube
       ( volume,
         area
       ) where

import qualified Geometry.Cuboid as Cuboid

volume :: Float -> Float
volume side = Cuboid.Volume side side side

area :: Float -> Float
area side = Cuboid.Area side side side

Geometry/Cuboid.hs

module Geometry.Cuboid
       ( volume,
         area
       ) where

volume :: Float -> Float -> Float -> Float
volume a b c = rectArea a b * c

area :: Float -> Float -> Float -> Float
area a b c = rectArea a b * 2 + rectArea a c * 2 + rectArea c b * 2

rectArea :: Float -> Float -> Float
rectArea a b = a * b

Geometry/Sphere.hs

module Geometry.Sphere
       ( volume,
         area
       ) where

volume :: Float -> Float
volume radius = (4.0 / 3.0) * pi * (radius ^ 3)

area :: Float -> Float
area radius = 4 * pi * (radius ^ 2)

モジュールインポート

import Geometry.Sphere