定义lambda-calculus构造函数的正确方法

时间:2018-08-21 12:19:26

标签: lambda-calculus typed-lambda-calculus

在lambda演算中有没有找到词条的明确方法?例如,假设我们有一个配对构造器

pair = λa. λb. λf. f a b

,我们有fst构造函数

fst = λp. p (λa. λb. a)

返回该对的第一个元素,我们现在必须定义snd构造函数,该构造函数返回该对的第二个元素。我已经来定义它了

snd = λp. p (λa. λb. b)snd (pair a b) = b

snd也可以定义为

snd = λp. p (λb. λa. b)

问题是,是否有明确的方法定义新的构造函数?

当我必须定义构造函数时,人们应该如何思考?当我被要求定义新的构造函数时,如何测试答案是否正确。

1 个答案:

答案 0 :(得分:1)

(λa. (λb. b)) x y = (λb. b) y = y

但是

(λb. (λa. b)) x y = (λa. x) y = x

,所以不,两者是不相等的:第一个定义返回其 second 参数,但是第二个定义返回其 first 参数。

除了与参数建立对应关系外,名称不计算在内。参数的位置计数。

关于它的思考方式,我经常发现以 combinatory 风格写下定义要容易得多:

pair a b selector = selector a b

fst apair = apair first_argument_selector

snd apair = apair second_argument_selector

first_argument_selector  a b = a

second_argument_selector a b = b

我认为这很清楚。 “给定选择器过程,一对ab将首先送入a,然后送入b,然后送入。” 等。

我们可以通过简单的语法转换在两种样式之间来回切换,例如:

second_argument_selector     a     b = b       =>
second_argument_selector     a = (λb . b)      =>
second_argument_selector = (λa . (λb . b))

如意算盘的原则通常非常有用:我们使用某些函数,就像它们已经被编写一样;然后它们的用途决定了我们必须如何定义它们。就像我们对上面的first_argument_selectorsecond_argument_selector所做的一样。

好名字会有所帮助。视觉上对齐代码会有所帮助。另外,使用完整的括号(就像我在文章顶部所做的那样)。