2016-02-14 50 views
0

我刚开始学习Haskell,我试图在Haskell中使用lambda演算。我发现这个表达式将教堂的数字转换成数字,但我似乎无法弄清楚这个表达式中的0是什么意思。我找不到它:这个haskell表达式意味着什么

zero = (\f -> \x -> x) 
one = (\f -> \x -> f x) 
two = (\f -> \x -> f (f x)) 

getNum church = church (\x-> (x + 1)) 0 

这是最后一个让我困惑的零。这是lambda表达式的基本情况还是一些参数?

+1

教堂号码是接受两个参数的函数,而'church'变量就是这样一个数字。所以它被称为两个参数,一个是lambda表达式,另一个是0. –

+0

好的,谢谢!但是表达式(\ x->(x + 1))只有1个参数,所以当0被替换时,它变成0 + 1。但是它是如何工作5个左右的?我还是不太明白。教会是Haskell语言中预定义的东西吗? –

+0

也许你可以通过'getNum zero'求值,然后'getNum one',然后'getNum two'# –

回答

5

这是“教堂”功能的第二个参数。教会数字是在Lambda微积分中计算的一种方法。他们的工作方式与Peano号码相似。在那些你可以像这样计数

Z = 0 
S Z = 1 
S S Z = 2 

将“Z”读作“零”和“S”作为“后继”。所以1是0的继承者,2是1的继承者。实际上它是一元计数。

在Lambda微积分中,您只有函数应用程序,因此您可以将2定义为接受参数“f”并将其应用两次的函数。

在你的例子中,教会数字零,一和二被定义。每个函数都有两个参数。第一个参数是要应用的函数,第二个参数是应用它的值。 getnum函数使用功能succ(即\x -> x+1),然后将N次应用于基本情况“0”。

你也可以定义

getPeano church = church ('S':) "Z" 

这会的“S” S正确的号码,预先准备的Z到一个堂号转换成数字皮亚诺。

+0

噢,我现在明白了。非常感谢你的明确解释:) –

相关问题