【问题标题】:lambda calculus for functional programming用于函数式编程的 lambda 演算
【发布时间】:2009-11-02 17:21:11
【问题描述】:

在 lambda 演算中 (λ x. λ y. λ s. λ z. x s (y s z)) 用于两个 Church 数字的加法,我们如何解释这一点,有没有什么好的资源用于函数式编程的 lambda 演算?非常感谢您的帮助

【问题讨论】:

标签: functional-programming lambda lambda-calculus


【解决方案1】:

实际上是λ f1。 λ f2。 λs。 λz。 (f1 s (f2 s z)) 计算加法,因为它实际上是将 f2 表示的数字 (f2 s z) 替换为 (f1 s z) 内部的“零”。

示例:让我们为 f2 取两个,s s z 的扩展形式。 f1 为一:s z。将最后一个 z 替换为 f2,您将得到 s s s z,这是三个的扩展形式。

用黑板和挥手会更容易,抱歉。

【讨论】:

    【解决方案2】:

    在 lambda 演算中,您根据数据类型引发的操作对数据类型进行编码。例如,布尔值只是一个选择函数,它接受输入两个值 a 和 b,并返回 a 或 b:

                          true = \a,b.a   false = \a,b.b
    

    自然数有什么用?其主要计算目的是 提供迭代的界限。因此,我们将自然数编码为运算符 它接受输入一个函数 f、一个值 x,并迭代应用程序 f 超过 x 的 n 次:

                            n = \f,x.f(f(....(f x)...))
    

    f 出现 n 次。

    现在,如果你想从 x 开始迭代 n + m 次函数 f 您必须开始迭代 n 次,即 (n f x),然后迭代 m 额外的时间,从之前的结果开始,也就是

                                    m f (n f x)
    

    同样,如果你想迭代 n*m 次,你需要迭代 m 次 迭代 n 次 f 的操作(就像在两个嵌套循环中一样),即

                                     m (n f) x  
    

    前面的数据类型编码更正式地解释为 构造函数和相应的消除器(所谓的 Bohm-Berarducci 编码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      相关资源
      最近更新 更多