-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathData.hs
160 lines (117 loc) · 4.24 KB
/
Data.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
module Data where
import Prelude
--data Bool = True | False
--
--alwaysTrue :: Int -> Bool
--alwaysTrue n = True
--
--
--data B = T | F deriving (Show, Eq, Read, Enum)
--
--not' :: B -> B
--not' T = F
--not' F = T
--GHCi> show Red
--"Red"
--
--1
--instance Show Color where
--2
-- show = undefined
data Color = Red | Green | Blue
instance Show Color where
show Red = "Red"
show Green = "Green"
show Blue = "Blue"
-- Show Green = "Green"
-- Show Blue = "Blue"
stringToColor :: String -> Color
stringToColor "Red" = Red
stringToColor "Green" = Green
stringToColor "Blue" = Blue
--GHCi> charToInt '0'
--0
--GHCi> charToInt '9'
--9
charToInt :: Char -> Int
charToInt '0' = 0
charToInt '1' = 1
charToInt '2' = 2
charToInt '3' = 3
charToInt '4' = 4
charToInt '5' = 5
charToInt '6' = 6
charToInt '7' = 7
charToInt '8' = 8
charToInt '9' = 9
--Определите функцию cmp, сравнивающую элементы типа LogLevel так, чтобы было верно, что Error > Warning > Info.
--GHCi> cmp Error Warning
--GT
--GHCI> cmp Info Warning
--LT
data LogLevel = Error | Warning | Info
cmp Error Warning = GT
cmp Error Info = GT
cmp Warning Error = LT
cmp Warning Info = GT
cmp Info Warning = LT
cmp Info Error = LT
cmp Info Info = EQ
cmp Error Error = EQ
cmp Warning Warning = EQ
--
--
--Пусть объявлен следующий тип данных:
--
--data Result = Fail | Success
--
--И допустим определен некоторый тип данных SomeData и некоторая функция
--doSomeWork :: SomeData -> (Result,Int)
--возвращающая результат своей работы и либо код ошибки в случае неудачи, либо 0 в случае успеха.
--Определите функцию processData, которая вызывает doSomeWork и
--возвращает строку "Success" в случае ее успешного завершения, либо строку "Fail: N" в случае неудачи, где N — код ошибки.
--processData :: SomeData -> String
--processData someData = case doSomeWork someData of
-- (Success, 0) -> "Success"
-- (Fail, n) -> "Fail: " ++ show n
--data Shape = Circle Double | Rectangle Double Double
--
--area :: Shape -> Double
--area shape = case shape of
-- (Circle r) -> pi*r^2
-- (Rectangle x y) -> x*y
--
--В одном из прошлых заданий мы встречали тип Result и функцию doSomeWork:
--
--data Result = Fail | Success
--
--doSomeWork :: SomeData -> (Result,Int)
--Функция doSomeWork возвращала результат своей работы и либо код ошибки в
--случае неудачи, либо 0 в случае успеха. Такое определение функции
--не является наилучшим, так как в случае успеха мы вынуждены
--возвращать некоторое значение, которое не несет никакой смысловой нагрузки.
--
--Используя функцию doSomeWork, определите функцию doSomeWork' так,
--чтобы она возвращала код ошибки только в случае
--неудачи. Для этого необходимо определить тип Result'. Кроме того, определите instance Show для Result' так,
--чтобы show возвращал "Success" в случае успеха и "Fail: N" в случае неудачи, где N — код ошибки.
--
--data Result = Fail | Success
--data Result' = Result Int
--
--instance Show Result' where
-- show (Result n) = case n of
-- 0 -> "Success"
-- otherwise -> "Fail: " ++ show n
--
--doSomeWork' :: SomeData -> Result'
--doSomeWork' someData = case doSomeWork someData of
-- (Success, 0) -> (Result 0)
-- (Fail, n ) -> (Result n)
--
data Shape = Circle Double | Rectangle Double Double
square :: Double -> Shape
square a = Rectangle a a
isSquare :: Shape -> Bool
isSquare (Rectangle a b) = a == b
isSquare _ = False