module Company where newtype DeptNo = DeptNo Int deriving (Eq, Ord, Show) data Dept = Dept { deptnoDept :: DeptNo, dname :: String, loc :: String } deriving (Eq, Ord, Show) dept :: [Dept] dept = Dept (DeptNo 10) "ACCOUNTING" "NEW YORK" : Dept (DeptNo 20) "RESEARCH" "DALLAS" : Dept (DeptNo 30) "SALES" "CHICAGO" : Dept (DeptNo 40) "OPERATIONS" "BOSTON" : [] data Job = Clerk | Salesman | Manager | Analyst | President deriving (Eq, Ord, Enum, Show, Bounded) newtype EmpNo = EmpNo Int deriving (Eq, Ord, Show) data Emp = Emp { empno :: EmpNo, ename :: String, job :: Job, mgr :: Maybe EmpNo, sal :: Int, deptnoEmp :: DeptNo } deriving (Eq, Ord, Show) emp :: [Emp] emp = Emp (EmpNo 7369) "SMITH" Clerk (Just (EmpNo 7902)) 800 (DeptNo 20) : Emp (EmpNo 7499) "ALLEN" Salesman (Just (EmpNo 7698)) 1600 (DeptNo 30) : Emp (EmpNo 7521) "WARD" Salesman (Just (EmpNo 7698)) 1250 (DeptNo 30) : Emp (EmpNo 7566) "JONES" Manager (Just (EmpNo 7839)) 2975 (DeptNo 20) : Emp (EmpNo 7654) "MARTIN" Salesman (Just (EmpNo 7698)) 1250 (DeptNo 30) : Emp (EmpNo 7698) "BLAKE" Manager (Just (EmpNo 7839)) 2850 (DeptNo 30) : Emp (EmpNo 7782) "CLARK" Manager (Just (EmpNo 7839)) 2450 (DeptNo 10) : Emp (EmpNo 7788) "SCOTT" Analyst (Just (EmpNo 7566)) 3000 (DeptNo 20) : Emp (EmpNo 7839) "KING" President Nothing 5000 (DeptNo 10) : Emp (EmpNo 7844) "TURNER" Salesman (Just (EmpNo 7698)) 1500 (DeptNo 30) : Emp (EmpNo 7876) "ADAMS" Clerk (Just (EmpNo 7788)) 1100 (DeptNo 20) : Emp (EmpNo 7900) "JAMES" Clerk (Just (EmpNo 7698)) 950 (DeptNo 30) : Emp (EmpNo 7902) "FORD" Analyst (Just (EmpNo 7566)) 3000 (DeptNo 20) : Emp (EmpNo 7934) "MILLER" Clerk (Just (EmpNo 7782)) 1300 (DeptNo 10) : [] class DeptNoField r where deptno :: r -> DeptNo instance DeptNoField Dept where deptno = deptnoDept instance DeptNoField Emp where deptno = deptnoEmp