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

7 条特征按支持程度打分:满分 14、Python 实得 9;扣掉的 5 分里有 4 分在【表达式】和【副作用】上——那才是命门。

📝 本节和前面几节的关系

A.3~A.9 逐条讲完,这一节汇总打分,把 7 条压成两个问题。

一、实测:14 分得 9 分

完全支持 3 条(各 2 分):用函数编写程序、函数作为值、组合函数与参数。 部分支持 3 条(各 1 分):都是表达式、没有副作用、模式匹配与递归。 不支持 1 条(0 分):自动类型推断。 合计 9/14。

二、那 5 分扣在哪

表达式那一条扣 1 分:if/for 还是语句。 副作用那一条扣 1 分:语言不强制,只靠自觉。 模式匹配与递归扣 1 分:match 是后来补的,且没有尾递归优化。 类型推断扣 2 分:完全没有。 所以短板集中在【约束】上——函数式的力量来自限制,Python 不爱限制。

三、压成两个问题

① 有没有语句? 有,代码就不能随便嵌。 ② 允不允许随便改东西? 允许,就没法保证同输入同输出。 两问都过,才算函数式。 两问都不过,也不妨碍你借它的手法——推导式、纯函数、不可变,今天就能用。

四、动手 Demo:对7个特征的总结

按 2/1/0 三档给 7 条特征打分。 算总分,并统计各档条数。

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

print(sum(b for a, b in rows), 2 * len(rows))   # 9 14

实跑输出:

--------------------------------------------------------------------
对7个特征的总结
--------------------------------------------------------------------

  把 7 个特征按支持程度打分(2 = 完全支持,1 = 部分,0 = 没有):

  特征                   得分
  ----------------------------
  1 用函数编写程序       2
  2 所有表达式都有值     1
  3 函数作为值           2
  4 组合函数与参数       2
  5 没有副作用           1
  6 模式匹配与递归       1
  7 自动类型推断         0

      满分                        14 分
      实得                        9 分
      完全支持                    3 个
      部分支持                    3 个
      不支持                      1 个

  **9 分/14 分**——**扣掉的 5 分里,一半在【表达式】和【副作用】上,那才是命门。**
  **所以判断一个语言【像不像函数式】,只要问两句:**
  **① 有没有【语句】? ② 允不允许随便改东西?** 两问都过,才算。

实测:满分 14、实得 9 分;完全支持 3 条、部分 3 条、不支持 1 条。 扣分集中在【约束】上:函数式的力量来自限制,Python 不爱限制。 压成两个问题:有没有语句、允不允许随便改。

30 秒实验

  1. 用这张 7 行表给你常用的另一门语言也打一次分。
  2. 看看哪一条它比 Python 强、哪一条更弱。

常见误区

  1. 把 9 分当成【Python 不够好】。这是设计取向,不是缺陷。
  2. 以为分数高就一定好用。纯函数式语言写业务系统很吃力。
自测三问(点开对答案) 1. 满分与实得各是多少? —— 满分 14、实得 9。 2. 扣分集中在哪? —— 表达式(1)、副作用(1)、模式匹配与递归(1)、类型推断(2),都在约束上。 3. 两个终极问题是什么? —— 有没有语句、允不允许随便改东西。

相关笔记