【PL理论】(21) 函数式语言:支持匿名函数 fun x → E | 设计递归函数 | 支持递归函数:let rec ...

news2025/1/13 2:58:46

  • 💭 写在前面:本章我们将讲解支持匿名函数,先回顾一下 F# 语言表示函数的方法,然后引出它。随后我们讲解一下如何设计递归函数,最后让我们的 F- 语言支持递归函数。

目录

0x00 回顾:F# 语言

0x01 支持匿名函数:fun x → E

0x02 设计递归函数

0x03 支持递归函数:let rec ...


0x00 回顾:F# 语言

在F#教程中,我们可以使用 fun -> … 的语法来表示一个函数。

注意,这样的函数可以在不命名的情况下定义和使用。

在下面的示例中,函数 fun x -> x + 1 和 fun x -> x * 2 没有函数名。

因此,这些被称为 匿名函数 (anonymous function),或 lambda 函数 (\color{} \lambda)。

let add = fun x y -> x + y
let n = add 2 3
let m = (fun x -> x + 1) 4  // 这么写也可以
let l = List.map (fun x -> x * 2) [1; 2; 3]

0x01 支持匿名函数:fun x → E

让我们将这个特性引入到我们的 F- 语言中。

我们可以拓展我们的语法,以包含 \color{} fun\, x\rightarrow E 形式,定义这个表达式的语义是直接的。

有了 \color{} fun\, x\rightarrow E 的语法,实际上我们的语言就不再需要 let f x = E1 in E2 的语法了。

但是,为了用户方便,我们仍然会保留 let f x = ... 的语法。

0x02 设计递归函数

接下来,让我们考虑递归函数。请注意,之前的函数定义和应用的语义无法支持递归。

函数定义的语义:

函数应用的语义:

根据之前的定义,\color{} f 是一个函数,在闭包中捕获了一个空环境 ( { } ) 。

在评估 \color{} f 4 时,函数体 if ... else ... 在 \color{}\{x \mapsto 4 \} 下被评估:函数名 \color{} f 没有被绑定。

0x03 支持递归函数:let rec ...

现在,让我们来让 F- 语言支持递归,引入新语法 let rec ... 来定义递归函数。

现在,一个值也可以是递归函数:

\color{} v\in Val=Z+B+Func+RecFunc

\color{} RecFunc=Var\times Var \times E \times Env

它是一个元祖,包含函数名、参数名、函数体表达式以及捕获的环境。

函数引用的语义也必须更新,现在我们必须有两个单独的推理规则来推导 \color{} EE

若 \color{} e_1 被评估为一个递归函数,我们必须更新 \color{} {\rho }',同时绑定 \color{} x 和 \color{} f.

常规函数的应用:

递归函数的应用:

让我们回到之前的例子,确定我们的新语义是否起作用。

在新的语义中,\color{} f 被绑定到一个递归函数值 〈𝒇, 𝒙, if … else … ,{ }〉 

现在递归函数的应用也起作用了:

  • 在对 f 4 进行评估时,在 {𝒙 ↦ 𝟒, 𝒇 ↦ 〈𝒇, 𝒙, if … else … ,{ }〉} 下评估函数体 if ... else ... :现在 f 被绑定了,所以这个表达式可以成功地进行评估。


📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2024.6.10
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1817325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习笔记: 最详尽Airbnb租赁搜索排名设计

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! Airbnb租赁搜索排名 1. 问题陈述 Airbnb用户在特定地点搜索可用房源。系统应在搜索结果中对多个房源进…

Qt飞机大战小游戏

Gitee地址 :plane-game: 基于Qt的飞机大战小游戏 GitHub地址: https://github.com/a-mo-xi-wei/plane-game

Vue25-内置指令02:v-text指令

一、v-html对比v-text v-html支持结构的解析,v-text不支持结构的解析。 二、v-html的安全性问题 2-1、cookie的原理(node.js) 7天免登录,cookie实现。 cookie的本质就是类似于json的字符串,格式是:key-va…

图片导入AutoCAD建立草图—CAD图像导入插件

插件介绍 CAD图像导入插件可将PNG,JPG等格式图片导入到AutoCAD软件内建立图像边缘的二维线条模型。插件可以提取图像黑色或白色区域的边界,并可绘制原状边界或平滑边界两种样式。 模型说明 边界提取,黑色或白色边界的提取根据原图类型选择…

【云原生| K8S系列】Kubernetes Daemonset,全面指南

Kubernetes中的DaemonSet是什么? Kubernetes是一个分布式系统,Kubernetes平台管理员应该有一些功能可以在所有节点上运行特定于平台的应用程序。例如,在所有Kubernetes节点上运行日志代理。 这就是Daemonset发挥作用的地方。 Daemonset是一个原生的K…

查询满足条件的元组-WHRER子句(运算符、BETWEEN 、LIKE、IN、NULL)

一、WHERE子句(筛选出使选择表达式为真的元组) 1、SELECT-FROM子句可以实现数据的查询(会查询出所有元组),加上WHERE子句之后可以实现数据的筛选(会查询出满足条件的元组) SELECT 【ALL|DISTI…

windows 下 基于 WSL2安装DeepSpares进行YOLOV8 v5 的加速推理

文章大纲 简介软硬件限制安装安装 WSL2 基础环境WSL2 手动安装安装 miniconda 环境本地USB 摄像头使用:Windows 无延迟视频流本地USB 摄像头使用:WSL2 挂载 本地 USB 摄像头WSL2更新报错: 离线安装 wsl --update安装 DeepSpares测试打开本地USB 摄像头进行测试测试结果参考文…

50.Python-web框架-Django中引入静态的bootstrap样式

目录 Bootstrap 官网 特性 下载 在线样例 Bootstrap 入门 Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 在django中使用bootstrap 新建static\bootstrap5目录,解压后的Bootstrap文件,拷贝项目里就好。 在template文件里引用css文…

Nginx+KeepAlived高可用负载均衡集群的部署

目录 一.KeepAlived补充知识 1.一个合格的群集应该具备的特点 2.健康检查(探针)常用的工作方式 3.相关面试问题 问题1 问题2 二.Keepealived脑裂现象 1.现象 2.原因 硬件原因 运用配置原因 3.解决 4.预防 方法1 方法2 方法3 方法4 三.…

VUE之重定向redirect

VUE之路由和重定向redirect 这个小知识点是在学习做项目的时候遇到的一个问题,借鉴了一个他人的项目,是一个酒店管理系统,拿到源码之后导到我的vscode里。 参考链接 导的过程比较顺利,正常安装,加依赖,没有…

禁渔期水域监管:EasyCVR视频智能监控方案

一、背景与需求分析 根据农业部印发的《中国渔政亮剑2024系列专项执法行动方案》,我国将持续推进长江十年禁渔、海洋伏季休渔、黄河等内陆重点水域禁渔等专项行动。根据四川省相关规定,每年3月1日至6月30日为禁渔期,在此期间,四川…

坚持每天学编程的有多少?聊聊有多少人躺平了,工作生活压力大吗

以前刚开始学编程的时候,一晚上就能看完一本Frontpage网页编程的书,就像是WORD一样简单,第二天就敢去找工作。工作后学习VB6SQL SERVER数据库,几百页的大部头书,基本上一个月也能看完,后面还买了2个大书柜&…

【全开源】Java无人共享棋牌室茶室台球室系统JAVA版本支持微信小程序+微信公众号

无人共享棋牌室系统——棋牌娱乐新体验 🎲引言 随着科技的不断发展,传统棋牌室正逐渐迈向智能化、无人化。今天,我要为大家介绍的就是这款引领潮流的“无人共享棋牌室系统”。它不仅为棋牌爱好者提供了全新的娱乐体验,更在便捷性…

数据预处理 #数据挖掘 #python

数据分析中的预处理步骤是数据分析流程中的重要环节,它的目的是清洗、转换和整理原始数据,以便后续的分析能够准确、有效。预处理通常包括以下几个关键步骤: 数据收集:确定数据来源,可能是数据库、文件、API或网络抓取…

软件游戏提示msvcp140.dll丢失的原因分析及解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“计算机缺失msvcp140.dll”。那么,这个错误是什么意思呢?它会造成哪些问题?小编将从以下几个方面进行详细解析。 一,了解msvcp140.dll是什么 …

尚品汇-(一)

(1)技术介绍 (2)业务介绍 (3)虚拟机安装 可以稍后配置镜像:选第二个 采用第二项NET模式: 安装完成:开启 不选择界面的,选择基础的 分配了ip: 测试网络 为…

HTML静态网页成品作业(HTML+CSS)—— 非遗皮影戏介绍网页(6个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有6个页面。 二、作品演示 三、代…

blender bpy将顶点颜色转换为UV纹理vertex color to texture

一、关于环境 安装blender的bpy,不需要额外再安装blender软件。在python控制台中直接输入pip install bpy即可。 二、关于代码 本文所给出代码仅为参考,禁止转载和引用,仅供个人学习。 本文所给出的例子是https://download.csdn.net/downl…

动态javaweb 建立-准备阶段

一、实验内容: 1.定义一个inputjsp页面接收数据输入的长和宽。 2.创建一个javaBean,包含长、宽和面积三个成员变量,分别有对应的get方法和set方法。 3.定义一个业务模型calculate.java,用来计算矩形的面积。 4.定义一个…

HTTP3版本和实现验证

HTTP3协议基于Google的 QUIC 协议,由互联网工程任务组(IETF)来制定。目录还是草案,已经进行到第33版。 HTTP3 是基于 QUIC 协议的 http。传输层是UDPQUIC,应用层仍是HTTP,即request/respose, request里也仍…