我刚开始学习Haskell,我试图在Haskell中使用lambda演算。我发现这个表达式将教堂数字转换为数字,但我似乎无法弄清楚这个表达式中的0是什么意思。我无法在任何地方找到它:
zero = (\f -> \x -> x)
one = (\f -> \x -> f x)
two = (\f -> \x -> f (f x))
getNum church = church (\x-> (x + 1)) 0
这是让我困惑的最后一个零点。它是基本情况还是这个lambda表达式的一些参数?
答案 0 :(得分:4)
这是"教堂"的第二个论点。功能。教会数字是在Lambda微积分中计算的一种方式。他们的工作方式与Peano数字类似。在那些你算这个
的人Z = 0
S Z = 1
S S Z = 2
阅读" Z" as" Zero"和" S" as"接班人"。因此1是0的后继者,2是1的后继者。实际上是它的一元计数。
在Lambda Calculus中你只有函数应用程序,因此你可以将2定义为一个带参数的函数" f"并适用两次。
在你的例子中,教会数字为零,一个和两个被定义。每个都是一个带有两个参数的函数。第一个参数是要应用的函数,第二个参数是要应用它的值。 getnum
函数使用函数succ
(即\x -> x+1
),然后将其应用N次到基本情况" 0"。
你也可以定义
getPeano church = church ('S':) "Z"
这将在Z之前添加正确数量的S"以将教会号码翻译成Peano号码。