X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=exercises%2F_assignment4_answers.mdwn;h=135e06ce8e15a5cbe3ddd3ed029f451879b5b5a0;hp=ac1ab6eb24cb5d989381b6b82a8ee5ed05bcd6d6;hb=2d9654c7eb13ddda627147563b2e937c67c7b8e3;hpb=4b58f050598948e1345d1a5734257c656adb9002;ds=sidebyside diff --git a/exercises/_assignment4_answers.mdwn b/exercises/_assignment4_answers.mdwn index ac1ab6eb..135e06ce 100644 --- a/exercises/_assignment4_answers.mdwn +++ b/exercises/_assignment4_answers.mdwn @@ -24,4 +24,33 @@ What about `add 2 X`? So `add n X <~~> X` for all (finite) natural numbers `n`. - +Solutions to the factorial problem and the mutual recursion problem: + + let true = \y n. y in + let false = \y n. n in + let pair = \a b. \v. v a b in + let fst = \a b. a in ; aka true + let snd = \a b. b in ; aka false + let zero = \s z. z in + let succ = \n s z. s (n s z) in + let zero? = \n. n (\p. false) true in + let pred = \n. n (\p. p (\a b. pair (succ a) a)) (pair zero zero) snd in + let add = \l r. r succ l in + let mult = \l r. r (add l) 0 in + let Y = \h. (\u. h (u u)) (\u. h (u u)) in + + let fact = Y (\f n . zero? n 1 (mult n (f (pred n)))) in + + let Y1 = \f g . (\u v . f(u u v)(v v u)) + (\u v . f(u u v)(v v u)) + (\v u . g(v v u)(u u v)) in + + let Y2 = \f g . Y1 g f in + + let proto_even = \e o n. zero? n true (o (pred n)) in + let proto_odd = \o e n. zero? n false (e (pred n)) in + + let even = Y1 proto_even proto_odd in + let odd = Y2 proto_even proto_odd in + + odd 3