【问题标题】:Convert Python to Haskell / Lambda calculus将 Python 转换为 Haskell / Lambda 演算
【发布时间】:2009-11-28 23:03:06
【问题描述】:

Haskell 和 Lambda 演算中的 Python 代码是什么?

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

我在 lambda 演算中的尝试

\x. 77 (\x.x)

【问题讨论】:

  • Lambda 演算没有状态的概念。打印涉及状态。
  • 我想你打算返回 f2 并调用 f1,因为正如所写,你的 f1 返回 None 并且未被调用。
  • 这段 Python 代码试图做什么?这是相当生硬的代码。也许拥有更真实的 Python 代码会更有启发意义。或者您正在尝试理解的 lambda 演算中是否有一些特定的概念?

标签: python haskell lambda lambda-calculus


【解决方案1】:

在 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”编译为 lambda 演算:

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

还有 Lambda Calculus 中的 Python 程序。

【讨论】:

  • 我想我们可以优化为(\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)))。
【解决方案2】:

哈斯克尔:

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

main :: IO ()
main = f1

或者更像你的 lambda 演算:

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

main :: IO ()
main = print f1

【讨论】:

    【解决方案3】:

    我不知道 python,所以我可能完全错了,但这是我对 Haskell 的解释。

    f1 = let x = 77 in show x
    

    或者,因为你在那里有一个常数

    f1 = show 77
    

    【讨论】:

      【解决方案4】:

      在 lambda 演算中:

      λprint. print 77
      

      【讨论】:

      • Python 程序不接受 print 函数的参数。
      • 那么正确的翻译是λ77. λprint. print 77,或者,如果你翻转参数,λx.x。 :)
      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      相关资源
      最近更新 更多