#include <iostream>
#include <functional>
using namespace std;
//fix :: (a -> a) -> a
//fix f = let x = f x in x
//fac = fix $ \f n -> if (n <= 0) then 1 else n * f (n - 1)
//===========================================================
//fac = let f n = if (n <= 0) then 1 else n * f (n - 1) in f
int fac(int n)
{
/*let*/ function<int(int)> f = [&](int n){ if (n <= 0) return 1; else return n * f (n - 1);}; /*in*/
return f(n);
}
int main() {
cout<<fac(5)<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vZml4IDo6IChhIC0+IGEpIC0+IGEKLy9maXggZiA9IGxldCB4ID0gZiB4IGluIHgKLy9mYWMgPSBmaXggJCBcZiBuIC0+IGlmIChuIDw9IDApIHRoZW4gMSBlbHNlIG4gKiBmIChuIC0gMSkKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy9mYWMgPSBsZXQgZiBuID0gaWYgKG4gPD0gMCkgdGhlbiAxIGVsc2UgbiAqIGYgKG4gLSAxKSBpbiBmCmludCBmYWMoaW50IG4pCnsKCS8qbGV0Ki8gZnVuY3Rpb248aW50KGludCk+IGYgPSBbJl0oaW50IG4peyBpZiAobiA8PSAwKSByZXR1cm4gMTsgZWxzZSByZXR1cm4gbiAqIGYgKG4gLSAxKTt9OyAvKmluKi8KCXJldHVybiBmKG4pOwp9CgppbnQgbWFpbigpIHsKCWNvdXQ8PGZhYyg1KTw8ZW5kbDsKCXJldHVybiAwOwp9