哪些语言功能无法用lambda定义?

时间:2015-11-06 17:29:30

标签: lambda functional-programming language-design language-features

似乎lambda几乎可以用于任何东西(即使看起来更复杂),但它确实有其局限性。

lambda没有涵盖哪些用例?

1 个答案:

答案 0 :(得分:6)

lambda(即函数)本身并不是很有趣。这是JavaScript中的一个功能:



function id(x) {
    return x;
}




这个JavaScript程序有什么作用?什么都没有。

但是,函数具有可调用的危险特性。

调用时,函数可以执行任何(条件适用):

authorize_nuclear_attack(launch_codes); // oops

因此,一个lambda可以潜在做任何事情。

考虑一下,每个C程序都是一个名为main的函数。

但Aadit,您需要一些其他语言功能来实现lambda的主体。

  1. 您如何声明,定义,更新和评估变量?
  2. 如果不使用if声明,您将如何做出决定?
  3. 如果没有for循环,你会如何重复一段代码?
  4. 如果没有排序运算符,您将如何编写顺序代码块?
  5. 如何在不使用原始+运算符的情况下添加两个数字?
  6. 如何?

    事实上。创建新函数的能力(即 lambda抽象)和调用函数的能力(即 lambda application )不足以编写整个程序。

    但是,它已经足够接近了。

    我们绝对要求编写任何程序的唯一其他语言功能(我的意思是任何程序)是获得的权力变量的值(即估值)。

    其他所有语言功能都是:

    1. 这三个特征中的一个固有。
    2. 或者可以从这三个特征中得出。
    3. 让我们考虑一下:

      1. 声明变量的能力是lambda抽象中固有的:

        function id(x) { // declare variable x
            return x;    // valuate variable x
        }
        
      2. 定义变量(以及更新viz-a-viz递归)的能力是lambda应用程序中固有的:

        id(something);   // let x := something in the body of the function id
        
      3. 决策的力量可以来自lambda抽象和选择性评估:

        function boolean_true(then_branch, else_branch) {
            return then_branch;
        }
        
        function boolean_false(then_branch, else_branch) {
            return else_branch;
        }
        
        function if_statement(boolean_condition, then_branch, else_branch) {
            return boolean_condition(then_branch, else_branch);
        }
        
      4. 重复的力量可以通过“吃自己的尾巴”得出,如下所示:

        function dragon(dragon) {
            return dragon(dragon); // infinite loop
        }
        
        dragon(dragon);
        

        我当然指的是ouroboros龙:

        Ouroboros Dragon

        想象一下龙永远像一个轮子一样旋转,试图吃掉自己的尾巴。无限循环。

        也可以使用选择性评估(a.k.a.分支)创建终止循环。

      5. 序列操作的强大功能可以通过编写函数来导出:

        function substitution(f, g) { // S combinator from SKI combinator calculus
            return function (x) {
                return f(x, g(x));
            };
        }
        
        // substitution(f, g) is equivalent to (statement g; statement f)
        // where the semicolon is the sequencing operator like in C
        
      6. 添加两个数字的能力可以通过将数字编码为函数来获得:

        function zero(f, x) {         // 0
            return x;
        }
        
        function add1(n) {            // n + 1
            return function (f, x) {
                return f(n(f, x));
            };
        }
        
        function add(m, n) {          // m + n
            return function (f, x) {
                return m(f, n(f, x));
            };
        }
        
      7. 重申一下,创建新功能的能力(即 lambda抽象),调用函数的能力(即 lambda application )以及获取值的能力变量(即评估)一起允许您编写可以使用任何其他语言(如C或Java)编写的每个可能的程序。

        Lambda演算捕获了可计算性的概念。

        这意味着每个算法或半算法都可以在lambda演算中表达(即可以解决的每个问题的解决方案或者可以部分求解的每个问题的部分解都可以在lambda演算中表示)

          

        似乎lambda几乎可以用于任何东西(即使看起来更复杂),但它确实有其局限性。

        lambda演算的唯一限制是你不能表达没有解决方案的问题的解决方案(甚至不是部分解决方案)。这样一个问题的一个例子是,“如果程序P暂停P所有输入?”

        换句话说,如果H在所有输入上停止,则H(P) = true不能写P,否则H(P) = falseH。如果您设法编写函数function P(x) { return H(P) ? P(x) : x; } ,则以下程序始终不正确:

        H

        如果P认为P始终停止,则H会进入无限循环。

        如果P认为{{1}}并非始终停止,那么它始终会停止。

          

        lambda没有涵盖哪些用例?

        lambda演算未涵盖的唯一用例是能够计算不可计算的函数。但是,因为不可计算的函数有点 uncomputable ,我会说没有lambda演算所涵盖的用例。

        话虽如此,没有人使用lambda演算来进行任何实际的编程(就像没有人使用图灵机作为实际的计算机一样)。 lambda演算和图灵机的功率相等。然而,他们是非常不同的野兽。

        大多数命令式编程语言(如C和Java)都基于图灵机。大多数函数式编程语言(如Haskell和OCaml)都基于lambda演算。一个优秀的程序员是任何一方但不是另一方的专家。一个优秀的程序员对两者都很满意。