| 1 | import System |
|---|
| 2 | import Char |
|---|
| 3 | |
|---|
| 4 | data V = Fun (V -> V) |
|---|
| 5 | | Val Int |
|---|
| 6 | | Str String |
|---|
| 7 | |
|---|
| 8 | app :: V -> V -> V |
|---|
| 9 | app (Fun f) v = f v |
|---|
| 10 | |
|---|
| 11 | unchurch :: V -> Int |
|---|
| 12 | unchurch c = i where |
|---|
| 13 | Val i = c `app` Fun inc `app` Val 0 |
|---|
| 14 | inc (Val x) = Val (x+1) |
|---|
| 15 | church i = Fun (\f -> Fun (\x -> iterate (app f) x !! i)) |
|---|
| 16 | |
|---|
| 17 | -- \l . l (\a b i.unchurch a : unlist b) "" |
|---|
| 18 | unlist :: V -> String |
|---|
| 19 | unlist l = s where Str s = unlist' l |
|---|
| 20 | unlist' :: V -> V |
|---|
| 21 | unlist' l = l `app` Fun walk `app` Str "" where |
|---|
| 22 | walk a = Fun (\b -> Fun (\i-> Str (chr (unchurch a) : unlist b))) |
|---|
| 23 | |
|---|
| 24 | cons a b = Fun (\x -> x `app` a `app` b) |
|---|
| 25 | nil = Fun (\a -> Fun (\b -> b) ) |
|---|
| 26 | tolist "" = nil |
|---|
| 27 | tolist (x:xs) = cons (church (ord x)) (tolist xs) |
|---|
| 28 | |
|---|
| 29 | main= interact (\i->unlist (((Fun (\v0 -> (v0 `app` v0)) `app` Fun (\v0 -> (v0 `app` v0))) `app` (Fun (\v0 -> (v0 `app` v0)) `app` Fun (\v0 -> (v0 `app` v0)))) `app` tolist i)) |
|---|