(* An example with session types, including choice. (Type error) *) #load "libthread" #load "libsessiontype" open SessionType type 'a protocol = !'a; !'a; ?'a; 1 |+| !'a; ?'a; 1 (* switched branches *) let server (c : int protocol dual channel) = match follow c with | Right c -> let (x, c) = recv c in let (y, c) = recv c in send c (x + y); () | Left c -> let (x, c) = recv c in send c (0 - x); () let client c x y = let c = sel1 c in let c = send c x in let c = send c y in let (r, _) = recv c in r let main x y = let rv = newRendezvous () in AThread.fork (fun () -> server (accept rv)); client (request rv) x y in print (main 3 4)