哪些语言特性不能用 lambda 来定义?

2023-12-30

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

lambda 未涵盖哪些用例?


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

function id(x) {
    return x;
}

这个 JavaScript 程序是做什么的?没有什么。

然而,函数具有可调用的危险特性。

调用时,函数可能会执行以下操作anything(有条件):

authorize_nuclear_attack(launch_codes); // oops

因此,简单来说 lambda 可以潜在地做任何事情。

想想看,每个 C 程序都是一个函数,称为main.

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

  1. 您将如何声明、定义、更新和评估变量?
  2. 如果不使用if陈述?
  3. 如何在没有for loop?
  4. 如果没有排序算子?
  5. 如何在不使用原语的情况下将两个数字相加+操作员?

How?

的确。创建新功能的能力(即lambda 抽象)和调用函数的能力(即拉姆达应用)不足以编写整个程序。

然而,它已经非常接近足够了。

我们唯一的其他语言功能绝对地要求写any程序(我的意思是any程序)是获取变量值的能力(即估值).

所有其他语言功能是:

  1. 要么是这三个特征之一所固有的。
  2. 或者可以从这三个特征推导出来。

让我们考虑一下:

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

    function id(x) { // declare variable x
        return x;    // valuate variable x
    }
    
  2. 定义变量(并更新可视化递归)的能力是 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);
    

    我当然指的是衔尾蛇龙:

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

    也可以使用以下命令创建终止循环可选择的估值(又名分支)。

  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));
        };
    }
    

重申一下,创建新功能的权力(即lambda 抽象),调用函数的能力(即拉姆达应用)以及获取变量值的能力(即估值)一起允许您编写可以使用任何其他语言(例如 C 或 Java)编写的所有可能的程序。

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

这意味着每个算法或半算法都可以用 lambda 演算来表达(即每个可以解决的问题的解或每个可以部分解决的问题的部分解都可以用 lambda 演算来表达)。

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

lambda 演算的唯一限制是您无法表达没有解决方案(甚至不是部分解决方案)的问题的解决方案。这种问题的一个例子是,“给定一个程序P does P停止所有输入?”

也就是说,不可能写出一个函数H这样H(P) = true if P停止所有输入,并且H(P) = false否则。如果您确实编写了该函数H那么对于以下程序来说它总是不正确的:

function P(x) {
    return H(P) ? P(x) : x;
}

If H认为P然后总是停止P进入无限循环。

If H认为P并不总是停止然后它总是停止。

lambda 未涵盖哪些用例?

lambda 演算未涵盖的唯一用例是能够计算不可计算的函数。然而,由于不可计算的函数有点不可计算的我想说,没有任何用例是 lambda 演算所涵盖的。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪些语言特性不能用 lambda 来定义? 的相关文章

  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • lambda 表达式的“类型”可以表达吗?

    将 lambda 表达式视为可调用对象的 语法糖 是否可以表达未命名的基础类型 一个例子 struct gt bool operator int l int r return l gt r Now int l int r return l
  • 如何确定 std::function 的参数数量?

    我有以下问题 假设您想编写一个可以采用 lambda 表达式的通用函数 我知道如果参数是 std function 类型 那么我不仅可以使用 lambda 还可以使用函数 甚至可以使用函数指针 所以第一步 我做了以下事情 void prin
  • std::bind 重载解析

    下面的代码工作正常 include
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 枚举相对于旧的“类型安全枚举”模式的优势?

    在 JDK1 5 之前的 Java 中 Typesafe Enum 模式是实现只能采用有限数量值的类型的常用方法 public class Suit private final String name public static final
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca
  • 通过消除嵌套的 for 循环来改进此代码

    R 包corrplot除其他内容外 还包含这个漂亮的功能 cor mtest lt function mat conf level 0 95 mat lt as matrix mat n lt ncol mat p mat lt lowCI
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • 创建 lambda 二维数组

    因此 我搜索了几个网站和其他有关此问题的问题 但似乎没有一个答案适合我 我有有效的代码 我的编程导师建议我更改链接if else if改为使用 lambda 表 我询问是否使用某种哈希表 他说仅对 9 个项目使用哈希 真正的程序有 9 个
  • 访问默认 lambda 参数中的模板类参数

    我正在写一个简单的通用池 模板类在构造函数中采用一个参数 该参数是一个工厂函数 用于根据需要实例化池中的对象 template
  • F# 中的动态编程

    实现解决问题的动态规划算法的最优雅的方法是什么子问题重叠的问题 http en wikipedia org wiki Overlapping subproblem 在命令式编程中 人们通常会创建一个按问题大小索引的数组 至少在一维 然后算法
  • 如何检查深层 lambda 表达式中的 null 值? [复制]

    这个问题在这里已经有答案了 如何检查深层 lambda 表达式中的 null 值 举例来说 我有一个嵌套了几层的类结构 我想执行以下 lambda x gt x Two Three Four Foo 我希望它在 二 三 或 四 为 null
  • C++ 中带有 lambda 的简单自定义迭代器

    假设我有一个容器 其中包含int 一个作用于包含以下内容的容器的函数Point 并且我有一个函数可以给出一些int给我相应的Point它代表 想象一下我已经在一些大的场景中索引了场景中的所有点std vector
  • 忽略 Racket 中的多个返回值

    在 Racket 中 可以通过执行以下操作从函数返回多个值 define foo values 1 2 3 然后我们可以通过这样做来绑定它们 define values one two three foo Now one一定会1 two t
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 某些数据结构是否比其他数据结构更适合函数式编程?

    In 现实世界哈斯克尔 http book realworldhaskell org 有一个标题为 没有数组或哈希表的生活 的部分 其中作者建议在函数式编程中首选列表和树 而在命令式程序中可能会使用数组或哈希表 这是有道理的 因为在创建新列
  • 相当于 Java 中 C++ 的 std::bind 吗?

    有没有一种方法可以像 C 中的 std bind 一样将 Java 中的参数绑定到函数指针 Java 中类似的东西会是什么 void PrintStringInt const char s int n std cout lt lt s lt
  • Angular 4 中的箭头函数(Lambda 函数)

    我对lambda知之甚少 lambda表达式被视为一个函数 我们有很多方法可以做到这一点 这是我的简单功能TypeScript file byPan card1 card2 return card1 pan card2 pan 我在 HTM

随机推荐

  • 现有文件上的 java.io.FileNotFoundException

    当我尝试打开文件时出现此错误 java io FileNotFoundException D Portable 20Programs Android 20Development workspace3 XXX desktop bin Worl
  • Play 的 API 上找不到 JPA.getJPAConfig 方法

    我正在使用最新版本的 Play v 1 2 3 我的系统需要从一个数据库读取数据并将其保存到另一个数据库 我在 Play 文档中发现有一个名为 play db JPA getJPAConfig 的方法来完成这项工作 我需要在源数据库中进行本
  • 基于第三列的 pandas 数据框颜色的 Seaborn 散点图

    我有一个 pandas 数据框 其中包含 组名 结果 和 温度 列 我绘制了一个 Seaborn 群图 其中 x groupname 和 y result 它显示了分成组的结果数据 我还想做的是使用颜色图根据标记的温度对标记进行着色 例如最
  • 如何更改 VS Code 中特定单词的颜色?

    有没有办法用自定义颜色为特定单词着色 我正在查看 editor tokenColorCustomizations 但似乎没有任何暗示 我想轻松地从其他代码中辨别出一段特定的代码 例如自定义方法 例如在 javascript 中 您经常使用
  • 使用 scikit Pipeline 测试模型,但仅预处理数据一次

    假设我有一个数据管道 它进行预处理并在最后有一个估计器 现在 如果我只想在管道的最后一步更改估计器 模型 我该如何做而不再次预处理相同的数据 下面是一个代码示例 pipe make pipeline ColumnSelector colum
  • Spring 4.x/3.x (Web MVC) REST API 和 JSON2 Post 请求,如何一次性解决?

    在详细介绍之前 我知道 Stackoverflow 上已经有很多对话和相关问题 他们都以不同的方式帮助我 所以我想我将我的发现全部放在一起作为一个有组织的常见问题解答来总结我的发现 相关概念 您当然知道这些 但我只是将它们写为快速回顾 如果
  • 保留尾随空格 Sybase

    我有一大块文本数据 我将其拆分并写入多行varchar 255 表的列 有时 最后一个字符恰好是空格 当我读回这一行时 尾随空格被截断 我只得到 254 个字符 当我将下一行附加到这一行的末尾时 这会弄乱我的数据 我的代码将完整的 255
  • 从 ASP.NET 到 .NET Core 的 DelegateHandler

    在一个旧的 asp net 项目中 我有一个类实现DelegatingHandler我为每条路线设置的 public class AdminSecurityMessageHandler DelegatingHandler private r
  • 使用 Dynamics CRM Web API 创建帖子

    一个 Post 实体 https msdn microsoft com en us library mt607553 aspx https msdn microsoft com en us library mt607553 aspx 无法使
  • 如果在缓冲区上调用 glBufferData 之后再调用它,是否会发生内存泄漏?

    因为我认为这应该分配缓冲区 如果你调用它两次 旧的会被删除 还是存在内存泄漏 我正在尝试决定根据需要频繁更改缓冲区大小的最佳选择 使用 glBufferData 是最佳选择吗 我想是的 只要不漏水就行 OGL 文档说 glBufferDat
  • 同时读取和写入寄存器

    我计划在 FPGA 上用 VHDL 设计一个类似 MIPS 的 CPU CPU 将具有经典的五级管道 没有转发和危险预防 在计算机体系结构课程中 我了解到第一个 MIPS CPU 用于在时钟上升沿读取寄存器文件并在时钟下降沿写入 我使用的F
  • 最后执行的特定数据库查询

    我知道如何在 SSMS 中使用以下 SQL 获取最后执行的查询 SELECT deqs last execution time AS Time dest text AS Query FROM sys dm exec query stats
  • 组合多个 DbGeography 多边形

    我正在寻找组合多个多边形以减少点数的方法 这会是前进的方向吗 var pol1 DbGeography PolygonFromText POLYGON 2 91790532309701 53 3657440952224 2 91790532
  • 链接器错误(未定义的引用)与“static constexpr const char*”和完美转发[重复]

    这个问题在这里已经有答案了 include
  • 如何在 R 中的特征哈希矩阵上使用 H2o

    我正在研究一个中等数据集 train data 还有 124 个变量和 50 00 000 个观测值 对于分类变量 我通过 R 中的 hashed model matrix 函数对其使用了特征哈希 feature hashing b lt
  • 在临时文件夹中创建了很多临时 magick 文件

    我正在使用imagick https github com gographics imagick用于在 http 处理程序中调整图像大小和裁剪图像的库 其中没有写任何东西 tmp文件夹 但据我所知 该文件夹中正在创建许多此类文件 并且其大小
  • 如何在现有项目中激活 GitLab Pages?

    我想发布我的 Java 项目的代码覆盖率报告already在 GitLab 上 我使用 JaCoCo 在位于以下位置的文件夹中生成代码覆盖率报告app target site jacoco 我发现我必须激活 GitLab Pages 但是这
  • 获取整个索引中的总词频 (Elasticsearch)

    我试图计算特定术语在整个索引中出现的总次数 术语收集频率 我尝试通过使用术语向量来做到这一点 但这仅限于单个文档 即使在指定文档中存在术语的情况下 响应似乎在某个 doc count 在 field statistics 内 处达到最大值
  • Android 3.0及以上版本无法从res中获取xml数据

    类似问题 https code google com p android issues detail id 38929 很少有预定义的xml我把它放在下面res gt raw gt first xml现在我在运行时获取并显示如下数据 Nod
  • 哪些语言特性不能用 lambda 来定义?

    看起来 lambda 几乎可以用于任何事情 即使它看起来更复杂 但它确实有其局限性 lambda 未涵盖哪些用例 lambda 即函数 本身并不是很有趣 这是 JavaScript 中的一个函数 function id x return x