网络书屋(Web Reading Room)

A blogging framework for hackers.

HaskellModule

Reference Here

模块化,这样才能方便构建较大型的项目,解决更加复杂的问题。 其中MyData.hs是模块文件 注意,模块中添加类型时候使用(..); 添加函数时候直接使用函数名 TestMyData.hs是测试模块文件

基本语法结构:

module MyData ( 类型(..) …. 函数名 …) where 类型声明 … 函数声明 …

注意 MyData.hs一定是和module后面的MyData一样的!

调用方式

import MyData


MyData.hs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
module MyData
(MetricUnit(..),
    ImperialUnit(..),
    Measurement(..),
    convert
) where
-- How to use this module
-- new File Test.hs  
--    import MyData
--    reportMeasurement :: Measurement->String
--    reportMeasurement (MyData.MetricMeasurement x u)
--    = (show  x) ++ " " ++ (show u)
--    reportMesuarement m
--    =reportMeasurement (convert m)
-- N.B. If there are another file use Meter type,it will fail
-- 1
data MetricUnit = Meter|Liter|KiloGram deriving (Show,Eq)
-- 2
data ImperialUnit = Yard
                    | Gallon
                    | Pound
                    deriving (Show,Eq)
-- 3
data Measurement = MetricMeasurement Double MetricUnit
                    | ImperialMeasurement Double ImperialUnit
                   deriving (Show)   --If not,it will not show,Only
                            --in the type defition,but not function

-- 4
convert :: Measurement-> Measurement
-- Take attention for the () brace
convert (MetricMeasurement x u)
        | u == Meter  = ImperialMeasurement (1.0936*x) Yard
        | u == Liter  = ImperialMeasurement (0.2642*x) Gallon
        | u == KiloGram = ImperialMeasurement (2.2046*x) Pound
--wrong!
--        | u == "Meter"  = ImperialMeasurement (1.0936*x) Yard
--        | u == "Liter"  = ImperialMeasurement (0.2642*x) Gallon
--        | u == "KiloGram" = ImperialMeasurement (2.2046*x) Pound
convert (ImperialMeasurement x u)
        | u == Yard  = MetricMeasurement (0.9144*x) Meter
        | u == Gallon  = MetricMeasurement (3.7854*x) Liter
        | u == Pound = MetricMeasurement (0.4536*x) KiloGram

TestMyData.hs 注意,一定不要把Measurement-写成了 Mesuarement等错误的文字

1
2
3
4
5
6
7
8
import MyData
reportMeasurement :: Measurement->String
reportMeasurement (MyData.MetricMeasurement x u)
                = (show x) ++ " " ++ (show u)
reportMeasurement m =reportMeasurement (convert m)
--reportMeasurement (MyData.ImperialMeasurement x u)
--                = (show x) ++ " " ++ (show u)
---if imperial    let m = MetricMeasuremnt 2 Meter ...

运行结果

1
2
3
4
5
6
7
8
9
--Main> reportMeasurement (convert (ImperialMeasurement 5 Pound))
--"2.268 KiloGram"

*Main> let m = ImperialMeasurement 5 Pound
*Main> reportMeasurement m
"2.268 KiloGram"

*Main> reportMeasurement (MetricMeasurement 5 Meter)
"5.0 Meter"