Tuesday, 23 November 2010

skiminok: (xkcd)
Простой и в то же время кошмарный пример, демонстрирующий Силу и Мощь показательной функции.

> let f0 x = (x, x);;

val f0 : 'a -> 'a * 'a

> let f1 x = f0 (f0 x);;

val f1 : 'a -> ('a * 'a) * ('a * 'a)

> let f2 x = f1 (f1 x);;

val f2 :
  'a ->
    ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
    ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))

> let f3 x = f2 (f2 x);;

val f3 :
  'a ->
    ((((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))))) *
      ((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))))) *
     (((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))))) *
      ((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))))))) *
    ((((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))))) *
      ((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))))) *
     (((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))))) *
      ((((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))) *
       (((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a))) *
        ((('a * 'a) * ('a * 'a)) * (('a * 'a) * ('a * 'a)))))))


Если вам не жаль свой fsi.exe, можете пойти еще дальше:
> let f4 x = f3 (f3 x);;

Моя консоль честно трудилась 42 секунды, выводя тип этой функции на экран. В её возвращаемом значении 65536 упоминаний 'a.

Profile

skiminok: (Default)
skiminok

Most Popular Tags

July 2011

S M T W T F S
     12
3456789
10111213141516
17181920212223
242526272829 30
31