(* This is a transcript of a SML session just to demonstrate type inference *) Standard ML of New Jersey, Version 110.0.7, September 28, 2000 [CM&CMB] - 3; val it = 3 : int - it; val it = 3 : int - it + 1; val it = 4 : int - "hi"; val it = "hi" : string - 3.5; val it = 3.5 : real - (3,5); val it = (3,5) : int * int - ("hi", 5); val it = ("hi",5) : string * int - # 1 ("hi", 5); val it = "hi" : string # 2 ("hi", 5); val it = 5 : int - fn x => x+1; val it = fn : int -> int - fn x => x+3.5; val it = fn : real -> real - fn x => x; val it = fn : 'a -> 'a - fn (x,y) => (x,y); val it = fn : 'a * 'b -> 'a * 'b - fn (x,y) => (y,x); val it = fn : 'a * 'b -> 'b * 'a - fun first (x,y) = x; val first = fn : 'a * 'b -> 'a - first; val it = fn : 'a * 'b -> 'a - first(3,5); val it = 3 : int - first(3,"hi"); val it = 3 : int - fun inc (x,y) = (x+1,y); val inc = fn : int * 'a -> int * 'a - [3,5]; val it = [3,5] : int list - [3,"hi"]; stdIn:38.1-38.9 Error: operator and operand don't agree [literal] operator domain: int * int list operand: int * string list in expression: 3 :: "hi" :: nil - 3::[4]; val it = [3,4] : int list - fun currycons x y = x::y; val currycons = fn : 'a -> 'a list -> 'a list - currycons; val it = fn : 'a -> 'a list -> 'a list - currycons 3; val it = fn : int list -> int list - currycons "hi"; val it = fn : string list -> string list - it; val it = fn : string list -> string list - it; val it = fn : string list -> string list - it ["there"]; val it = ["hi","there"] : string list - - - - fun member (x, []) = false = | member (x, h::t) = x=h orelse member (x,t); val member = fn : ''a * ''a list -> bool - member (3, [5,3,4]); val it = true : bool - member (3, [5,4,6]); val it = false : bool - member ("hi", ["a", "b", "hi"]); val it = true : bool -