Standard ML of New Jersey (32-bit) v110.99 [built: Thu Dec 24 11:01:10 2020] - - hd []; stdIn:1.2-1.7 Warning: type vars not generalized because of value restriction are instantiated to dummy types (X1,X2,...) uncaught exception Empty raised at: smlnj/init/pervasive.sml:193.19-193.24 - - tl []; stdIn:3.1-3.6 Warning: type vars not generalized because of value restriction are instantiated to dummy types (X1,X2,...) uncaught exception Empty raised at: smlnj/init/pervasive.sml:195.19-195.24 - - - fun extreme cmp [] = raise Empty = | extreme cmp [x] = x = | extreme cmp (x::y::ys) = if cmp (x, y) then = extreme cmp (x::ys) = else = extreme cmp (y::ys); val extreme = fn : ('a * 'a -> bool) -> 'a list -> 'a - - - (op >); val it = fn : int * int -> bool - - (op <); val it = fn : int * int -> bool - - extreme (op <) [1,2,3,4,5,4,3,2,1]; val it = 1 : int - - extreme (op >) [1,2,3,4,5,4,3,2,1]; val it = 5 : int - - val max = extreme (op >); val max = fn : int list -> int - - max [1,2,3,4,5,4,3,2,1]; val it = 5 : int - - val min = extreme (op <); val min = fn : int list -> int - - val min = extreme (op <); val min = fn : int list -> int - - val min = extreme (op <); val min = fn : int list -> int - - - fun longer (s1, s2) = String.size s1 > String.size s2; [autoloading] [library $SMLNJ-BASIS/basis.cm is stable] [library $SMLNJ-BASIS/(basis.cm):basis-common.cm is stable] [autoloading done] val longer = fn : string * string -> bool - - val longest = extreme longer; val longest = fn : string list -> string - - - longest ["cat", "dog", "apple", "orange", "pear", "dogs", "cats"]; val it = "orange" : string - - - longest ["cat", "dog", "apple", "orange", "pear", "dogs", "cats"]; val it = "orange" : string - - longest ["cat", "dog", "apple", "orange", "pear", "dogs", "cats", "aaaaaaaaaaaaaa"]; val it = "aaaaaaaaaaaaaa" : string - - longest ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs", "cats", "aaaaaaaaaaaaaa"]; val it = "bbbbbbbbbbbbbbbbbb" : string - - - fun shorter (s1, s2) = String.size s1 < String.size s2; val shorter = fn : string * string -> bool - - val shortest = extreme shorter; val shortest = fn : string list -> string - - shortest ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs", "cats", "aaaaaaaaaaaaaa"]; val it = "dog" : string - - shortest ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs","0", "cats", "aaaaaaaaaaaaaa"]; val it = "0" : string - - - val maxString = extreme String.>; val maxString = fn : string list -> string - - maxstring ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs","0", "cats", "aaaaaaaaaaaaaa"]; stdIn:82.1-82.10 Error: unbound variable or constructor: maxstring - - maxString ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs","0", "cats", "aaaaaaaaaaaaaa"]; val it = "pear" : string - - maxString ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs","0","z", "cats", "aaaaaaaaaaaaaa"]; val it = "z" : string - - val minString = extreme String.<; val minString = fn : string list -> string - - - minString ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs","0","z", "cats", "aaaaaaaaaaaaaa"]; val it = "0" : string - - minString ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs","z", "cats", "aaaaaaaaaaaaaa"]; val it = "aaaaaaaaaaaaaa" : string - - minString ["cat", "dog", "apple", "bbbbbbbbbbbbbbbbbb", "orange", "pear", "dogs","z", "cats", "xaaaaaaaaaaaaaa"]; val it = "apple" : string - - - - - - fun extreme cmp [] = raise Empty = | extreme cmp [x] = x = | extreme cmp (x ::y::ys) = if cmp (x, y) then = extreme cmp (x::ys) = else = extreme cmp (y::ys); val extreme = fn : ('a * 'a -> bool) -> 'a list -> 'a - -