list a ::= Nil | Cons a (list a);
;;
backMap fl v = case fl of
Nil -> Nil;
Cons f fs -> Cons (f v) (backMap fs v)
end;
g = backMap (Cons not (Cons not Nil)) False;
add1 x = 1 + x;
hof f y = 1 + f y;
id x = x;
useHOF = hof id (hof (id id add1) 43);
nasty x = letrec loop=loop in loop;
map f l = case l of
Nil -> Nil;
Cons x xs -> Cons (f x) (map f xs)
end;
foldr op id ll = case ll of
Nil -> id;
Cons x xs -> op x (foldr op id xs)
end;
append l1 l2 = case l1 of
Nil -> l2;
Cons x xs -> Cons x (append xs l2)
end;
concat ll = case ll of
Nil -> Nil;
Cons xs xss -> append xs (concat xss)
end;
concat2 = foldr append Nil;
sum l = case l of
Nil -> 0;
Cons x xs -> x + sum xs
end;
sum2 = let add = \x y -> x + y in foldr add 0;
hd l = case l of
Nil -> nasty 0;
Cons x xs -> x
end;
length l = case l of
Nil -> 0;
Cons x xs -> 1 + length xs
end;
reverse l = case l of
Nil -> Nil;
Cons x xs -> append (reverse xs) (Cons x Nil)
end;
reverse_into l = letrec
rev = \acc lisp -> case lisp of
Nil -> acc;
Cons x xs -> rev (Cons x acc) xs
end
in rev Nil l;
f = length (reverse (Cons not (Cons not Nil)));
g1 = backMap funcList False;
funcList = Cons not (Cons not Nil);
areInverses f1 f2 equalPred testVal
= let dot = \f g x -> f (g x) in
case
equalPred testVal
((dot f2 f1) testVal) of
True -> True;
False -> False
end;
testInverses =
let sub = \a b -> b - a in
let add = \a b -> a + b in
let eq = \a b -> a == b in
areInverses (add 1) (sub 1) eq 5;
|