These examples demonstrate mutable types in ML, i.e. types where data can be changed.
(* C:\Documents and Settings\Default\Desktop\4651\examples\references.ml *)
let x = ref 5;;
x := !x + 1;;
x;;
(* a record with two mutable fields *)
type changeme = {mutable n: int; mutable s: string};;
let y = {n = 3; s = "apple"};;
y.s <- "banana";;
y;;
let sum = ref 0;;
(* find_sum modifies a global mutable variable sum *)
(* () is the unit element, represents "do nothing" *)
let rec find_sum = function
[] -> ()
| x :: xs -> sum := !sum + x; find_sum xs;;
let l = [2; 7; 9];;
find_sum l;;
sum;;
sum := 0;;
find_sum [];;
sum;;
sum := 0;;
find_sum [1; 2 ; 4; 8; -7];;
sum;;
(* using a local variable in a function *)
(* this should really have a loop*)
let f x =
let r = ref 0 in
if (x < 5) then (r := 6; !r)
else (r := 8; !r);;
(* a random number generator*)
let current_rand = ref 0;;
let random () =
current_rand := !current_rand * 25713 + 1345;
!current_rand;;
random();;
!current_rand;;
random();;
!current_rand;;
(* mutable types *)
(* I could make x mutable and y immutable *)
type mutable_pair = {mutable x: int; mutable y: int};;
let my_pair = {x = 5; y = 6};;
my_pair.x <- 99;;
my_pair.x;;