Преобразование Python в Haskell/лямбда-исчисление

Что такое код Python в Haskell и лямбда-вычислениях?

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

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

\x. 77 (\x.x)

person Léo Léopold Hertz 준영    schedule 28.11.2009    source источник
comment
В лямбда-исчислении нет понятия состояния. Печать включает состояние.   -  person codebliss    schedule 29.11.2009
comment
Я предполагаю, что вы намереваетесь вернуть f2 и вызвать f1, потому что, как написано, ваш f1 возвращает None и не вызывается.   -  person cthulahoops    schedule 30.11.2009
comment
См. также blog.sigfpe.com/2008/09/ on-writing-python-one-liners.html   -  person sdcvvc    schedule 14.06.2010
comment
Что пытается сделать этот код Python? Это довольно неестественный код. Возможно, было бы поучительнее иметь более реалистичный код Python. Или в лямбда-исчислении есть какая-то особая концепция, которую вы пытаетесь понять?   -  person MtnViewMark    schedule 15.06.2010


Ответы (4)


Хаскелл:

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
person Greg Bacon    schedule 28.11.2009

В Хаскеле:

f1 = f2
    where x  = 77
          f2 = print x

Рефакторинг, поскольку ввод-вывод просто запутывает проблему:

f1 = f2
    where x  = 77
          f2 = x

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

f1 = x
    where x = 77

Рефакторинг, так как вам нужна переменная?

f1 = (\x -> x) 77

Бета-снижение:

f1 = 77

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

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

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

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

person Don Stewart    schedule 13.06.2010
comment
Думаю, мы можем оптимизировать его до (\three.(\seven.(\ten.\f.\x.ten (seven f) (seven f x)) (\f.\x.three f (seven f x))) (\f.\x.f (three f (three f x)))) (\f.\x.f(f(f x))). - person Rotsor; 13.10.2011

Я не знаю Python, поэтому могу ошибаться, но это моя интерпретация Haskell.

f1 = let x = 77 in show x

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

f1 = show 77
person Matt Ellen    schedule 28.11.2009

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

λprint. print 77
person Apocalisp    schedule 29.11.2009
comment
Программа Python не принимает аргумент для функции print. - person MtnViewMark; 15.06.2010
comment
Тогда правильным переводом будет λ77. λprint. print 77 или, если перевернуть аргументы, λx.x. :) - person Rotsor; 13.10.2011