2009-11-28 8 views
1

Quel est le code Python dans le calcul de Haskell et Lambda?Convertir le calcul Python en Haskell/Lambda

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

Ma tentative de calcul lambda

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

Le calcul lambda n'a aucun concept d'état. L'impression implique l'état. – codebliss

+1

Je présume que vous avez l'intention de retourner f2 et d'appeler f1, car comme écrit, votre f1 renvoie None et n'est pas appelé. – cthulahoops

+0

Voir aussi http://blog.sigfpe.com/2008/09/on-writing-python-one-liners.html – sdcvvc

Répondre

3

Haskell:

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

main :: IO() 
main = f1 

Ou pour être plus comme votre lambda-calcul:

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

main :: IO() 
main = print f1 
1

Je ne sais pas python, donc je pourrais être complètement mal, mais c'est mon interprétation Haskell.

f1 = let x = 77 in show x 

Ou, puisque vous avez une constante, il

f1 = show 77 
1

Dans le calcul lambda:

λprint. print 77 
+0

Le programme Python ne prend pas d'argument pour la fonction 'print'. – MtnViewMark

+0

Oui, implicitement. – Apocalisp

+0

Alors la traduction correcte est 'λ77. λprint. print 77', ou, si vous retournez les arguments, 'λx.x'. :) – Rotsor

8

Dans Haskell:

f1 = f2 
    where x = 77 
      f2 = print x 

refactorisation, depuis IO seulement confond le problème:

f1 = f2 
    where x = 77 
      f2 = x 

refactorisation:

f1 = x 
    where x = 77 

refactorisation, puisque vous voulez la variable?

f1 = (\x -> x) 77 

Beta réduire:

f1 = 77 

Et vous avez votre programme Haskell.

Le calcul lambda n'a pas de littéraux numériques (contrairement à Haskell), nous devons donc utiliser Church numerals. Donc, la compilation "77" au calcul lambda:

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

Et il y a votre programme Python dans Lambda calcul.

+1

+1 juste pour utiliser les chiffres de l'église. J'ai lollé. –

+2

Je suppose que nous pouvons l'optimiser à '(\ trois. (\ Dix. \ F. \ X.ten (sept f) (sept fx)) (\ f. \ X.three f (sept fx))) (\ f. \ xf (trois f (trois fx)))) (\ f. \ xf (f (fx))) '. – Rotsor