• 【Scheme】Scheme 编程学习 (六) —— lambda 函数


    【Scheme】Scheme 编程学习 (六) —— lambda 函数


    原视频地址https://www.bilibili.com/video/BV1Kt411R7Wf?p=6&vd_source=90a310afa0e6807b3cb32a6c18005c02

    Lambda function

    I - 概述 (The Name)

    Lambda 函数的起源

    Alonso Church 阿隆佐·邱奇(1903年6月14日–1995年8月11日) 美国数学家,姓名更多写作 Alonzo Church

    • 发明了 Lambda演算 (invented the “lambda calculus”) ,也可以称为 λ 演算
      更多关于 lambda 演算内容参见 https://zhuanlan.zhihu.com/p/98104104
    • 一种以数学的形式 (in a mathematical form) 描述过程的通用方法 (General way to describe processes)
      过程 (processes) 我们现在也称为程序 (program)
    • Scheme 是将其转化为实际编程语言的一次尝试 (Scheme is an attempt to translate it into an actual program language)

    II - 匿名函数 (Anonymous functions)

    function without name, takes in a list of symbol

    lambda 函数就是没有名字的函数(匿名函数),它的输入为符号列表

    > (lambda (x y) (+ x y))
    ; 这是一个输入为 x y 的函数,函数体为将两个输入相加
    ; #
    
    • 1
    • 2
    • 3

    定义 lambda 函数

    ; use define procedure
    > (define s (lambda (x y) (+ x y)))
    > (s 2 5)
    ; 7
    
    • 1
    • 2
    • 3
    • 4

    III - 定义可重复访问的函数 (Defining functions revisited)

    ; 定义一个 sum procedure 
    (define (sum x y) (+ x y))
    ; 使用lambda 方式定义
    (define sum (lambda (x y) (+ x y)))
    
    • 1
    • 2
    • 3
    • 4

    接下来看两个例子如何使用

    IV - 举例 - 创建点对 (Example: Building pairs)

    (define (mcons a b)
    	(lambda (cmd)
    		(if (equal? cmd "car")
    			a
    			b)))
    ; 定义一个过程 mcons,输入为 a b,返回一个过程,但这个过程需要一个入参为 cmd , 当 cmd 为 "car" 时 返回 a, 否则返回 b
    ; 这里也使用了闭包 (closure)			
    (define (mcar pair) (pair "car"))
    (define (mcdr pair) (pair "cdr"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    ; 定义一个符号 foo
    > (define foo (mcons 1 2))
    > (mcar foo)
    ; 1
    > (mcdr foo)
    ; 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    V - 举例自定义数字 Example: numbers

    5.1 - bricks (基石)

    (define n0 (lambda () null))
    ; 定义 n0 为 lambda 的结果,此lambda 无入参(takes no argument) 返回过程 null
    (define (minc x) (lambda () x))
    ; 定义 minc 过程,入参为x, 为lambda的结果,lambda 为一个无入参的过程 返回 x
    (define (mdec x) (x))
    ; 定义 mdec 过程,调用 x
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5.2 - mortar (砌合)

    (define n1 (minc n0))
    (define n2 (minc n1))
    (define n3 (minc n2))
    (define n4 (minc n3))
    (define n5 (minc n4))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    (define n0 (lambda () null))
    (define (minc x) (lambda () x))
    (define n1 (minc n0))
    (define n2 (minc n1))
    
    • 1
    • 2
    • 3
    • 4

    调用

    > (n0)
    ; () ; 结果为 null 也就是空表
    > (n1)
    ; #
    ; 调用 n1 返回过程 n0
    > (n2)
    ; #
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.3 - questions(思考)

    (define (mzero? x) (null? (x)))
    ; 定义 mzero? 过程,输入为x,如果 x 为 null 结果为 true,否则为 false (false otherwise)
    (define (mequal? x y)
    	(cond 
    		((mzero? x) (mzero? y))
    		; 如果 mzero? 对于 x 为真则返回 mzero? y 
    		((mzero? y) (mzero? x))
    		; 如果 mzero? 对于 y 为真则返回 mzero? x
    		(else (mequal? (mdec x) (mdec y)))))
    		; 其他情况对x 使用 mdec ,对 y 使用 mdec,然后调用 mequal 计算两者的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    对 n1 n0 调用 mequal?

    > (mequal? n1 n0)
    ; #f
    > (mequal? n1 n1)
    ; #t
    > (mequal? n4 n5)
    ; #f
    > (mequal? n4 n4)
    ; #t
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.4 - magic (魔幻时刻)

    (define (m+ x y)
    	(if (mzero? y)
    		x
    		(m+ (minc x) (mdec y))))
    
    • 1
    • 2
    • 3
    • 4

    如果 y 使得 mzero? 成立,则返回 x
    否则递归调用 m+ 计算 x 的增量 y 的减量 ,y 的减量是否使得 mzero? 为真。

    > (mequal? (m+ n0 n2) n2)
    ; #t
    > (mequal? (m+ n0 n2) n3)
    ; #f
    > (mequal? (m+ n0 n2) (m+ n1 n2))
    ; #f
    > (mequal? (m+ n2 n3) n5)
    ; #t
    > (mequal? (m+ n5 n5) (m+ n4 (m+ n3 n3)))
    ; #t
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    关于本小节自定义了变量为 n0,为自定义的 0 值。
    minc 为 increment 增量,也可以理解为 value++ 也就是 value = value + 1;
    mdec 为 decrement 减量 ,也可以理解为 value-- 也就是 value = value - 1;
    mzero 为 是否为自定义的 0 值 即 n0
    mequal 为验证两个结果是否相等

  • 相关阅读:
    【giszz笔记】产品设计标准流程【8】
    如何使用ChatGPT辅助设计工作
    Efficient Batched Oblivious Transfer Protocol
    Ipadpro2020支持电容笔吗?好用的电容笔品牌排名推荐
    多线程(初阶)
    【Debug危机系列】Embedding层的千层套路
    MySQL-InnoDB引擎-架构和事务原理
    VR社交应用Rec Room再获1.45亿美元融资,用户突破3700万
    unity urp 实现遮挡显示角色轮廓
    http1.1 的默认长连接 Connection: keep-alive 与 TCP KeepAlive 之间区别
  • 原文地址:https://blog.csdn.net/weixin_44488341/article/details/134023849