fork download
  1. #include <stdio.h>
  2. #include <functional>
  3.  
  4. using namespace std;
  5.  
  6. template<typename A, typename B>
  7. using F = function<A(B)>;
  8.  
  9. template<typename A>
  10. using CN = F<F<A, A>, F<A, A>>;
  11.  
  12. template<typename A>
  13. CN<A> zero() {
  14. return [](F<A,A>) -> F<A,A> {
  15. return [](A i) -> A {return i;};
  16. };
  17. }
  18.  
  19. template<typename A>
  20. CN<A> inc(CN<A> n) {
  21. return [=](F<A,A> f) -> F<A,A> {
  22. return [=](A a) -> A {
  23. return n(f)(f(a));
  24. };
  25. };
  26. }
  27.  
  28. template<typename A>
  29. CN<A> operator*(CN<A> a, CN<A> b) {
  30. return [=](F<A,A> f) -> F<A,A> {
  31. return b(a(f));
  32. };
  33. }
  34.  
  35. template<typename A>
  36. CN<A> operator+(CN<A> a, CN<A> b) {
  37. return [=](F<A,A> f) -> F<A,A> {
  38. return [=](A i) -> A {
  39. auto i1 = a(f)(i);
  40. return b(f)(i1);
  41. };
  42. };
  43. }
  44.  
  45. CN<unsigned int> i2c(unsigned int n) {
  46. auto l = zero<unsigned int>();
  47. for(int i = 0; i<n; i++)
  48. l = inc(l);
  49. return l;
  50. }
  51.  
  52. unsigned int c2i(CN<int> n) {
  53. auto n2 = n([&](int a)->int {return a+1;});
  54. return n2(0);
  55. }
  56.  
  57. int multiply(unsigned int a, unsigned int b) {
  58. return c2i(i2c(a) * i2c(b));
  59. }
  60.  
  61. int main() {
  62. unsigned int a, b;
  63. a = 4;
  64. b = 3;
  65. printf("%d*%d=%d", a, b, multiply(a, b));
  66. return 0;
  67. }
Success #stdin #stdout 0s 3420KB
stdin
Standard input is empty
stdout
4*3=12