datatype mobile = Weight of int | Node of mobile * mobile;
fun weight (Weight n) = n
| weight (Node(l,r)) = weight l + weight r;
fun balanced (Weight _) = true
| balanced (Node(l,r)) =
balanced l andalso balanced r andalso (weight l = weight r);
(* Some test cases *)
val m1 = Node (Node(Weight 2, Weight 2), Node(Weight 2, Weight 2));
val m2 = Node(Node(Weight 2, Node(Weight 1, Weight 1)),
Node(Weight 2,Weight 2));
val m3 = Node(Node(Node(Weight 2, Weight 2),
Node(Weight 2, Node(Weight 1, Weight 1))),
Node(Weight 4, Weight 4));
val m4 = Node(Node(Node(Weight 2, Weight 2),
Node(Weight 1, Node(Weight 1, Weight 1))),
Node(Weight 4, Weight 4));
val m5 = Node(Weight 2, Weight 3);
map balanced [m1,m2,m3,m4,m5];
(* returnss [true,true,true,false,false] *)
datatype exp = I of int | Plus of exp * exp
| Times of exp * exp | Square of exp;
fun evaluate(I n) = n
| evaluate(Plus (E1,E2)) = evaluate E1 + evaluate E2
| evaluate(Times(E1,E2)) = evaluate E1 * evaluate E2
| evaluate(Square E1) = let val x = (evaluate E1) in x * x end;
val expex = Square (Plus (Times (I 1, I 10), Times (I 3, I 2)));
evaluate expex;
(* returns 256 *)
fun iterate f 0 x = x
| iterate f n x = f(iterate f (n - 1) x);
val iterate = fn : ('a -> 'a) -> int -> 'a -> 'a
val cases = fn : (real -> 'a) -> (real * real -> 'a) -> numb -> 'a
val project = fn : numb -> real
f2.sml:12.1-14.38 Warning: match nonexhaustive
(R x,R y) => ...
(R x,C (u,v)) => ...
(C (x,y),C (u,v)) => ...
val plus = fn : numb * numb -> numb
pick([],[],[]). pick([X|L],[yes|K],[X|M]) :- pick(L,K,M). pick([_|L],[no |K],M ) :- pick(L,K,M). union([],[]). union([L|Ls],M) :- union(Ls,K), append(L,K,M). minlist([], 1001). minlist([X|L],Tmp) :- minlist(L,Tmp), Tmp < X. minlist([X|L],X ) :- minlist(L,Tmp), Tmp >= X. %% A more efficient solution would can be written as % minlist([X|L],Min) :- minlist(L,Tmp), % (Tmp < X, Min = Tmp; Tmp >= X, Min = X).