🧩 附章 函数式语言是怎样工作的
📄 一句话概括

7 个特征逐条拿到 Python 上验:3 个完全具备、3 个部分、1 个没有——最要紧的是【都是表达式】和【没有副作用】这两条,它们才是分水岭。

📝 本节和前面几节的关系

A.1 说明为什么讲,这一节先把 7 条列出来当提纲,A.3~A.9 逐条展开。

一、实测:7 条在 Python 上的判定

完全具备 3 条:用函数编写程序、函数作为值、灵活组合函数与参数。 部分具备 3 条:所有表达式都有值、没有副作用、模式匹配与递归。 不具备 1 条:自动类型推断。 所以 Python 不是函数式语言,是【借了它一半】。

二、两条分水岭

第 2 条【所有表达式都有值】:有语句的语言,代码就不能随便嵌进别处。 第 5 条【没有副作用】:允许随便改东西,就没法保证同输入同输出。 这两条决定了代码能不能【组合】——其余五条都是围绕这两条的配套。

三、怎么用这张表

判断一门语言像不像函数式,只问两句:① 有没有语句?② 允不允许随便改? 判断自己写的东西像不像函数式,也问两句:有没有中间变量?有没有改外面? 注意这不是评分表——是给你一张地图,知道自己在哪。

四、动手 Demo:函数式语言的7个特征

把 7 个特征逐条在 Python 上判一次。 统计【有/部分/没有】各几个。

rows = [("1 用函数编写程序", "有"),
        ("2 所有表达式都有值", "部分"),
        ("3 函数作为值", "有"),
        ("4 灵活组合函数与参数", "有"),
        ("5 没有副作用", "部分"),
        ("6 模式匹配与递归", "部分"),
        ("7 自动类型推断", "没有")]

print(sum(1 for a, b in rows if b == "有"))       # 3
print(sum(1 for a, b in rows if b == "部分"))     # 3
print(sum(1 for a, b in rows if b == "没有"))     # 1

实跑输出:

--------------------------------------------------------------------
函数式语言的7个特征
--------------------------------------------------------------------

  把 7 个特征逐条拿到 Python 上验,**看它是【有】【部分】还是【没有】:**

  特征                     Python 的情况                     判定
  ----------------------------------------------------------------
  1 用函数编写程序         def 与 lambda 都有                有
  2 所有表达式都有值       if/for/赋值是语句               部分
  3 函数作为值处理         能赋值、能传递、能返回            有
  4 灵活组合函数与参数     partial/闭包都在                 有
  5 没有副作用             语言不强制,靠自觉                部分
  6 模式匹配与递归         3.10 起有 match,无尾调用优化     部分
  7 自动类型推断           动态类型,注解不推断              没有

      特征总数                    7 个
      完全具备                    3 个
      部分具备                    3 个
      不具备                      1 个

  **7 个里只有 3 个是【完全具备】**——**所以 Python 不是函数式语言,是【借了它一半】。**
  **最要紧的是第 2 条和第 5 条**:表达式与副作用,**这两条才是函数式的分水岭。**
  **后面 7 节逐条展开,就是为了把这两条讲透。**

实测:7 条里完全具备 3 条、部分 3 条、不具备 1 条。 两条分水岭是【都是表达式】和【没有副作用】,其余五条是配套。 所以 Python 是借了函数式一半的语言,不是函数式语言。

30 秒实验

  1. 用那两句问话(有没有语句/允不允许改)去判一门你熟悉的语言。
  2. 数一数你今天写的代码里有几个中间变量、几处改了外部对象。

常见误区

  1. 背 7 个特征当知识点。只记两条分水岭就够用。
  2. 以为【部分具备】是缺点。工程语言都是妥协出来的。
自测三问(点开对答案) 1. 7 条里 Python 完全具备几条? —— 3 条:用函数编写程序、函数作为值、组合函数与参数。 2. 两条分水岭是哪两条? —— 所有表达式都有值、没有副作用。 3. 怎么快速判断一门语言像不像函数式? —— 问两句:有没有语句、允不允许随便改东西。

相关笔记