-
Notifications
You must be signed in to change notification settings - Fork 0
/
algebraic.hs
211 lines (152 loc) · 4.9 KB
/
algebraic.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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE FlexibleInstances #-}
module Algebraic where
data PugType = PugData
data HuskyType a = HuskyData
data DogueDeBordeaux doge = DogueDeBordeaux doge
myPug = PugData :: PugType
myHusky :: HuskyType a
myHusky = HuskyData
myOtherHusky :: Num a => HuskyType a
myOtherHusky = HuskyData
myOtherOtherHusky :: HuskyType [[[[[[Int]]]]]]
myOtherOtherHusky = HuskyData
myDoge :: DogueDeBordeaux Int
myDoge = DogueDeBordeaux 10
--badDoge :: DogueDeBordeaux String
--badDoge = DogueDeBordeaux 10
data Doggies a =
Husky a
| Mastiff a
deriving (Eq, Show)
-- 1. Doggies is a type constructor
-- 2. Doggies is of kind * -> *
-- 3. Doggies String is of kind *
-- 4. Husky 10 :: Doggies Int
-- 5. Husky (10 :: Integer) :: Doggies Integer
-- 6. Mastiff "S" :: Doggies String
-- 7. DogueDeBordeaux is a data constructor and a type constructor
-- 8. DogueDeBordeaux "doggie" :: DogueDeBordeaux String
data Price = Price Integer deriving (Eq, Show)
data Manufacturer = Mini | Mazda | Tata deriving (Eq, Show)
data Airline =
PapuAir
| CatapultsR'us
| TakeYourChancesUnited
deriving (Eq, Show)
data Vehicle =
Car Manufacturer Price
| Plane Airline Integer
deriving (Eq, Show)
myCar = Car Mini (Price 14000) :: Vehicle
urCar = Car Mazda (Price 20000)
clownCar = Car Tata (Price 7000)
doge = Plane PapuAir 1000
isCar :: Vehicle -> Bool
isCar (Car _ _) = True
isCar _ = False
isPlane :: Vehicle -> Bool
isPlane (Plane _ _) = True
isPlane _ = False
areCars :: [Vehicle] -> Bool
areCars = all isCar
getManu :: Vehicle -> Manufacturer
getManu (Car m _) = m
data Example2 a b = Example2 a b deriving (Eq, Show)
class TooMany a where
tooMany :: a -> Bool
instance TooMany Int where
tooMany n = n > 42
newtype Goats = Goats Int deriving (Show, Eq, TooMany)
newtype SpecialTooMany = SpecialTooMany (Int, String) deriving (Show, Eq)
instance TooMany SpecialTooMany where
tooMany (SpecialTooMany (n,s)) = tooMany n
newtype TooMany3 = TooMany3 (Int, Int) deriving (Show, Eq)
instance TooMany TooMany3 where
tooMany (TooMany3 (n1, n2)) = tooMany (n1 + n2)
instance (Num a, TooMany a) => TooMany (a, a) where
tooMany (a, a') = (tooMany a) && (tooMany a')
data Fiction = Fiction deriving Show
data Nonfiction = Nonfiction deriving Show
data BookType =
FictionBook Fiction
| NonfictionBook Nonfiction
deriving Show
type AuthorName = String
data Author = Author (AuthorName, BookType)
-- data FlowerType = Gardenia
-- | Daisy
-- | Rose
-- | Lilac
-- deriving Show
type Gardener = String
data Garden =
Gardenia Gardener
| Rose Gardener
| Lilac Gardener
| Daisy Gardener
deriving Show
data GuessWhat =
Chickenbutt deriving (Eq, Show)
data Id a =
MkId a deriving (Eq, Show)
data Product a b =
Product a b deriving (Eq, Show)
data Sum a b =
First a
| Second b
deriving (Eq, Show)
data RecordProduct a b =
RecordProduct { pfirst :: a
, psecond :: b }
deriving (Eq, Show)
newtype NumCow = NumCow Int deriving (Eq, Show)
newtype NumPig = NumPig Int deriving (Eq, Show)
data Farmhouse = Farmhouse NumCow NumPig deriving (Eq, Show)
type Farmhouse' = Product NumCow NumPig
newtype NumSheep = NumSheep Int deriving (Eq, Show)
data BigFarmhouse = BigFarmhouse NumCow NumPig NumSheep
type BigFarmhouse' = Product NumCow (Product NumPig NumSheep)
type Name = String
type Age = Int
type LovesMud = Bool
type PoundsOfWool = Int
data CowInfo = CowInfo Name Age deriving (Eq, Show)
data PigInfo = PigInfo Name Age LovesMud deriving (Eq, Show)
data SheepInfo = SheepInfo Name Age PoundsOfWool deriving (Eq, Show)
data Animal = Cow CowInfo | Pig PigInfo | Sheep SheepInfo deriving (Eq, Show)
type Animal' = Sum CowInfo (Sum PigInfo SheepInfo)
data OperatingSystem = Linux | OpenBSD | Mac | Windows deriving (Eq, Show)
data ProgrammingLanguage = Haskell | Agda | Idris | PureScript deriving (Eq, Show)
data Programmer =
Programmer { os :: OperatingSystem
, lang :: ProgrammingLanguage }
deriving (Eq, Show)
allOperatingSystems :: [OperatingSystem]
allOperatingSystems = [Linux, OpenBSD, Mac, Windows]
allLanguages :: [ProgrammingLanguage]
allLanguages = [Haskell, Agda, Idris, PureScript]
allProgrammers :: [Programmer]
allProgrammers =
concat $ map (\os -> map (\lang -> Programmer { lang = lang, os = os }) allLanguages) allOperatingSystems
data Quantum = A | B | C deriving (Eq, Show)
convert :: Quantum -> Bool
convert A = True
convert B = True
convert C = True
convert2 :: Quantum -> Bool
convert2 A = True
convert2 B = True
convert2 C = False
convert3 :: Quantum -> Bool
convert3 A = True
convert3 B = False
convert3 C = True
-- 2^3 possible functions since we have a choice of 2 values for each of 3 possible inputs
data Quad = One | Two | Three | Four deriving (Eq, Show)
--1. 8 possible values
--2. 16 possible values
--3. 4^4 possible values
--4. 8 possible values
--5. 16 possible values
--6. 65536 possible values