ss@arovane % sml ~/projects/sml Standard ML of New Jersey v110.52 [built: Fri Jan 21 16:42:10 2005] - (* 3.4.1 *) - (* x^1000 *) - val rec poweri = fn (_, 0) => 1.0 | (x, 1) => x | (x, i) => x * poweri(x, i-1); val poweri = fn : real * int -> real - poweri(2.0, 3); val it = 8.0 : real - fun power1000(x:real) = = let val x100 = poweri(x, 100); val x500 = x100*x100*x100*x100*x100 = in x500*x500 end; val power1000 = fn : real -> real - power1000(2.0); val it = 1.07150860719E301 : real - (* 3.4.2 *) - fun split(nil) = (nil, nil) = | split(x::nil) = ([x], nil) = | split(x::y::zs) = = let = val (M, N) = split(zs) = in = (x::M, y::N) = end; val split = fn : 'a list -> 'a list * 'a list - split([1,2,3,4,5,6,7,8]); val it = ([1,3,5,7],[2,4,6,8]) : int list * int list - fun split2(nil) = (nil, nil) = | split2(x::nil) = ([x], nil) = | split2(x::y::zs) = = let = val T = split2(zs) = in = (x::(#1(T)), y::(#2(T))) = end; val split2 = fn : 'a list -> 'a list * 'a list - split2([1,2,3,4,5]); val it = ([1,3,5],[2,4]) : int list * int list - (* 3.4.3 *) - (* powerSet [3.3.13] *) - val rec insertHead = fn (x, nil) => nil | (x, y::ys) => (x::y)::insertHead(x, ys); val insertHead = fn : 'a * 'a list list -> 'a list list - val rec powerSet = fn nil => [nil] | x::xs => powerSet(xs)@insertHead(x, powerSet(xs)); val powerSet = fn : 'a list -> 'a list list - powerSet([1,2,3]); val it = [[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]] : int list list - powerSet([3,4,7]); val it = [[],[7],[4],[4,7],[3],[3,7],[3,4],[3,4,7]] : int list list - fun powerSet(nil) = [nil] = | powerSet(x::xs) = = let = val S = powerSet(xs) = in = S@insertHead(x, S) = end; val powerSet = fn : 'a list -> 'a list list - powerSet([1,2,3]); val it = [[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]] : int list list - powerSet([3,4,7]); val it = [[],[7],[4],[4,7],[3],[3,7],[3,4],[3,4,7]] : int list list - (* 3.4.4 *) - (* max element of list [3.2.1 f)] *) - fun max(nil) = 0 (* or NaN: Not an Number *) = | max(x::nil) = x = | max(x::y::zs) = if x > y then max(x::zs) else max(y::zs); val max = fn : int list -> int - max([3,5,8,2,1,0,9,~1]); val it = 9 : int val it = 9 : int - fun max2(nil) = 0 = | max2(x::nil) = x = | max2(x::xs) = = let = val m = max2(xs) = in = if x < m then m else x = end; val max2 = fn : int list -> int - max2([3,5,8,2,1,0,9,~1]); val it = 9 : int - (* 3.4.5 *) - (* (x^2)^i *) - (* Example: = f(x, 0) -> x^(2^0) = x^1 = x = f(x, 1) -> (x^2)^2 = x^4 = *) - fun mpower(x:real, 0) = x = | mpower(x, i) = = let val y = mpower(x, i-1) in y*y end; val mpower = fn : real * int -> real - mpower(1.0, 0); val it = 1.0 : real - mpower(2.0, 3); val it = 256.0 : real - mpower(2.0, 2); val it = 16.0 : real - (* 3.4.6 *) - (* sumPairs in Example 3.18 *) - val rec sumPairs = fn nil => 0 | (x, y)::zs => x + y + sumPairs(zs); val sumPairs = fn : (int * int) list -> int val Ps = [(2,5),(3,1)] : (int * int) list - sumPairs(Ps); val it = 11 : int - (* [(x1, y1), (x2, y2), ....] -> (x1 + x2 + ..., y1 + y2 + ...) *) - fun sumPairs2(nil) = (0, 0) = | sumPairs2((x, y)::zs) = = let = val (S1, S2) = sumPairs2(zs) = in = (x + S1, y + S2) = end; val sumPairs2 = fn : (int * int) list -> int * int - sumPairs2([(2, 1), (3, 4), (5, 5)]); val it = (10,10) : int * int - sumPairs([(1,2),(3,4),(5,6)]); val it = 21 : int - sumPairs2([(1,2),(3,4),(5,6)]); val it = (9,12) : int * int - (* 3.4.7 *) - (* [a1, a2, a3, a4, ...] -> (a1 + a3 + a5 + ..., a2 + a4 + a6 + ...) *) - fun f(nil) = (0, 0) = | f(x::nil) = (x, 0) = | f(x::y::zs) = = let = val (O, E) = f(zs) = in = (x + O, y + E) = end; val f = fn : int list -> int * int - f([1,2,3,4,5,6]); val it = (9,12) : int * int