0

我刚开始学习 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 表达式的基本情况还是某些参数?

4

1 回答 1

4

这是“教堂”函数的第二个参数。教会数字是在 Lambda 微积分中进行计数的一种方式。它们的工作方式与 Peano 数字类似。在你这样算的人中

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

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

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

在您的示例中,定义了教堂编号零、一和二。每个都是一个接受两个参数的函数。第一个参数是要应用的函数,第二个参数是要应用它的值。该getnum函数使用函数succ(ie \x -> x+1),然后将其 N 次应用于基本情况“0”。

你也可以定义

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

这将在 Z 前面添加正确数量的“S”,以将 Church 编号转换为 Peano 编号。

于 2016-02-14T15:48:51.573 回答