Spaces:
Paused
Paused
| (* Module signature *) | |
| module type DataProcessor = sig | |
| type 'a t | |
| val create : unit -> 'a t | |
| val process : 'a t -> 'a -> ('a, string) result | |
| val validate : 'a -> bool | |
| end | |
| (* Module implementation *) | |
| module StringProcessor : DataProcessor with type 'a = string = struct | |
| type 'a = string | |
| type t = { | |
| mutable processed_count: int; | |
| created_at: float; | |
| } | |
| let create () = { | |
| processed_count = 0; | |
| created_at = Unix.time (); | |
| } | |
| let process t input = | |
| t.processed_count <- t.processed_count + 1; | |
| if String.length input > 0 then | |
| Ok (String.uppercase_ascii input) | |
| else | |
| Error "Empty input" | |
| let validate input = | |
| String.length input > 0 | |
| end | |
| (* Type definitions *) | |
| type user = { | |
| id: int; | |
| name: string; | |
| email: string; | |
| created_at: float; | |
| } | |
| type 'a result = | |
| | Success of 'a | |
| | Error of string | |
| (* Variant type *) | |
| type message = | |
| | Text of string | |
| | Number of int | |
| | Tuple of string * int | |
| | Record of user | |
| (* Functor definition *) | |
| module type Comparable = sig | |
| type t | |
| val compare : t -> t -> int | |
| end | |
| module MakeSet (Item : Comparable) = struct | |
| type element = Item.t | |
| type t = element list | |
| let empty = [] | |
| let rec add x = function | |
| | [] -> [x] | |
| | hd :: tl as l -> | |
| match Item.compare x hd with | |
| | 0 -> l | |
| | n when n < 0 -> x :: l | |
| | _ -> hd :: add x tl | |
| let member x set = | |
| List.exists (fun y -> Item.compare x y = 0) set | |
| end | |
| (* Exception definition *) | |
| exception ValidationError of string | |
| (* Higher-order function *) | |
| let memoize f = | |
| let cache = Hashtbl.create 16 in | |
| fun x -> | |
| try Hashtbl.find cache x | |
| with Not_found -> | |
| let result = f x in | |
| Hashtbl.add cache x result; | |
| result | |
| (* Object-oriented features *) | |
| class virtual ['a] queue = object(self) | |
| val mutable items = [] | |
| method virtual push : 'a -> unit | |
| method virtual pop : 'a option | |
| method size = List.length items | |
| method is_empty = items = [] | |
| method protected get_items = items | |
| method protected set_items new_items = items <- new_items | |
| end | |
| class ['a] fifo_queue = object(self) | |
| inherit ['a] queue | |
| method push item = | |
| self#set_items (self#get_items @ [item]) | |
| method pop = | |
| match self#get_items with | |
| | [] -> None | |
| | hd::tl -> | |
| self#set_items tl; | |
| Some hd | |
| end | |
| (* Module for handling JSON-like data *) | |
| module Json = struct | |
| type t = | |
| | Null | |
| | Bool of bool | |
| | Number of float | |
| | String of string | |
| | Array of t list | |
| | Object of (string * t) list | |
| let rec to_string = function | |
| | Null -> "null" | |
| | Bool b -> string_of_bool b | |
| | Number n -> string_of_float n | |
| | String s -> "\"" ^ String.escaped s ^ "\"" | |
| | Array items -> | |
| "[" ^ String.concat ", " (List.map to_string items) ^ "]" | |
| | Object pairs -> | |
| let pair_to_string (k, v) = | |
| "\"" ^ String.escaped k ^ "\": " ^ to_string v | |
| in | |
| "{" ^ String.concat ", " (List.map pair_to_string pairs) ^ "}" | |
| end | |
| (* Main execution *) | |
| let () = | |
| let processor = StringProcessor.create () in | |
| let result = StringProcessor.process processor "hello world" in | |
| match result with | |
| | Ok processed -> Printf.printf "Processed: %s\n" processed | |
| | Error msg -> Printf.eprintf "Error: %s\n" msg; | |
| let queue = new fifo_queue in | |
| queue#push 1; | |
| queue#push 2; | |
| queue#push 3; | |
| let rec print_queue () = | |
| match queue#pop with | |
| | Some item -> | |
| Printf.printf "Item: %d\n" item; | |
| print_queue () | |
| | None -> () | |
| in | |
| print_queue () | |