2009-11-28 3 views
1

Что такое код Python в исчислении Haskell и Lambda?Преобразование Python в Haskell/исчисление Lambda

def f1(): 
    x = 77 
    def f2(): 
     print x 
    f2 
f1 

Моя попытка в лямбда-исчислении

\x. 77 (\x.x) 
+9

Исчисление лямбда не имеет понятия состояния. Печать включает состояние. – codebliss

+1

Предполагаю, что вы намерены вернуть f2 и вызвать f1, потому что, как написано, ваш f1 возвращает None и не имеет значения. – cthulahoops

+0

Также см. Http://blog.sigfpe.com/2008/09/on-writing-python-one-liners.html – sdcvvc

ответ

3

Haskell:

f1 :: IO() 
f1 = let x = 77 
     f2 = print x 
    in f2 

main :: IO() 
main = f1 

Или быть больше как ваш лямбда-исчисления:

f1 :: Int 
f1 = let f2 = x 
     x = 77 
    in f2 

main :: IO() 
main = print f1 
1

Я не знаю, python, так что я мог бы быть полностью неправильно, но это моя интерпретация Хаскелла.

f1 = let x = 77 in show x 

Или, так как у вас есть постоянная там

f1 = show 77 
1

В лямбда-исчисления:

λprint. print 77 
+0

Программа Python не принимает аргумент для функции 'print'. – MtnViewMark

+0

Он делает это, неявно. – Apocalisp

+0

Тогда правильный перевод равен 'λ77. λprint. print 77', или, если вы переверните аргументы, 'λx.x'. :) – Rotsor

8

В Haskell:

f1 = f2 
    where x = 77 
      f2 = print x 

рефакторинга, так как IO просто смущает вопрос:

f1 = f2 
    where x = 77 
      f2 = x 

Рефакторинг:

f1 = x 
    where x = 77 

рефакторинга, так как вы хотите переменную?

f1 = (\x -> x) 77 

Beta уменьшить:

f1 = 77 

И у вас есть программы в Haskell.

Исчисление Lambda не имеет числовых литералов (в отличие от Haskell), поэтому мы должны использовать Church numerals. Так компиляции «77» для лямбда-исчисления:

f1 = \f.\x. f (f (f (f (...) x))) 

И есть ваша программа Python в лямбда-исчислению.

+1

+1 только для использования церковных цифр. Я lol'ed. –

+2

Я думаю, мы можем оптимизировать его до '(\ three. (\ Seven. (\ Ten. \ F. \ X.ten (семь f) (семь fx)) (\ f. \ X.three f (seven fx))) (\ f. \ xf (три f (три fx)))) (\ f. \ xf (f (fx))). – Rotsor

Смежные вопросы