1{-# OPTIONS -fglasgow-exts #-} 2 3module CompanyDatatypes where 4 5import Data.Generics (Data, Typeable) 6 7-- The organisational structure of a company 8 9data Company = C [Dept] deriving (Eq, Show, Typeable, Data) 10data Dept = D Name Manager [Unit] deriving (Eq, Show, Typeable, Data) 11data Unit = PU Employee | DU Dept deriving (Eq, Show, Typeable, Data) 12data Employee = E Person Salary deriving (Eq, Show, Typeable, Data) 13data Person = P Name Address deriving (Eq, Show, Typeable, Data) 14data Salary = S Float deriving (Eq, Show, Typeable, Data) 15type Manager = Employee 16type Name = String 17type Address = String 18 19-- An illustrative company 20genCom :: Company 21genCom = C [D "Research" laemmel [PU joost, PU marlow], 22 D "Strategy" blair []] 23 24-- A typo for the sake of testing equality; 25-- (cf. lammel vs. laemmel) 26genCom' :: Company 27genCom' = C [D "Research" lammel [PU joost, PU marlow], 28 D "Strategy" blair []] 29 30lammel, laemmel, joost, marlow, blair :: Employee 31lammel = E (P "Lammel" "Amsterdam") (S 8000) 32laemmel = E (P "Laemmel" "Amsterdam") (S 8000) 33joost = E (P "Joost" "Amsterdam") (S 1000) 34marlow = E (P "Marlow" "Cambridge") (S 2000) 35blair = E (P "Blair" "London") (S 100000) 36 37-- Some more test data 38person1 = P "Lazy" "Home" 39dept1 = D "Useless" (E person1 undefined) [] 40