Guest User

Untitled

a guest
Jun 9th, 2013
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.74 KB | None | 0 0
  1. (**
  2.     Student modules using include module
  3. *)
  4.  
  5. type grade = Pass | No_pass
  6.  
  7. let string_of_grade = function
  8.     | Some Pass -> "Pass"
  9.     | Some No_pass -> "No pass"
  10.     | None -> "Not graded"
  11.  
  12. (**
  13.     "Base-class"
  14. *)
  15. module Student = struct
  16.     type student = {
  17.         name : string;
  18.         tests : int list;
  19.         course_grade : grade option;
  20.     }
  21.  
  22.     let make name = {
  23.         name = name;
  24.         tests = [];
  25.         course_grade = None
  26.     }
  27.  
  28.     let to_string s =
  29.         Printf.sprintf "Student: %s; number of tests made: %d; course grade: %s"
  30.             s.name
  31.             (List.length s.tests)
  32.             (string_of_grade s.course_grade)
  33. end
  34.  
  35. module GraduateStudent = struct
  36.     include Student
  37.     let compute_course_grade s =
  38.         let tests = s.tests in
  39.         let total = List.fold_left (+) 0 tests in
  40.         let grade = match total / List.length tests with
  41.             | q when q >= 80 -> Pass    (* <-- 80 for grad *)
  42.             | _ -> No_pass
  43.         in
  44.         {s with course_grade = Some grade}
  45. end
  46.  
  47. module UndergraduateStudent = struct
  48.     include Student
  49.     let compute_course_grade s =
  50.         let tests = s.tests in
  51.         let total = List.fold_left (+) 0 tests in
  52.         let grade = match total / List.length tests with
  53.             | q when q >= 70 -> Pass    (* <-- 70 for undergrad *)
  54.             | _ -> No_pass
  55.         in
  56.         {s with course_grade = Some grade}
  57. end
  58.  
  59. type grad_students =
  60.     | Grad of GraduateStudent.student
  61.     | Undergrad of UndergraduateStudent.student
  62.  
  63. let _ =
  64.     let student1 = GraduateStudent.make "Foo Barsson" in
  65.     let student2 = UndergraduateStudent.make "J.R.R Tolkien" in
  66.  
  67.     let roster = [
  68.         Grad student1;
  69.         Undergrad student2;
  70.     ] in
  71.  
  72.     List.iter (fun s ->
  73.         print_endline (match s with
  74.             | Grad s -> UndergraduateStudent.to_string s    (* <-- Don't want this to compile *)
  75.             | Undergrad s -> UndergraduateStudent.to_string s
  76.         )
  77.     ) roster;
  78.  
  79.     ()
Advertisement
Add Comment
Please, Sign In to add comment