15-150:函数式编程原理

卡内基梅隆大学一门关于 Standard ML 函数式编程的课程受到好评,被认为是学习现代 FP 概念的少见且结构良好的资源,例如强类型、不可变性和高阶函数。评论者围绕为何选择 SML 而不是更流行的 Haskell、OCaml 或 Lisp 展开争论,认为一门小巧、稳定、强类型的语言能帮助学生专注于核心思想,而不是工具链和高级特性。讨论还引出了更广泛的主题:优质 FP 教学材料的稀缺、纯函数式理想与日志和副作用等实际问题之间的张力,以及让计算机科学学生接触 Python 和 OOP 之外多种范式的价值。

计算机科学教育中对函数式编程的重视

  • 许多人欢迎大学层面的 FP 课程,并希望 FP 能比 OOP 更早、更广泛地教授。
  • 一些人描述了让学生学习多种范式和语言(C、C++、汇编、Haskell/Scala/Racket、Java、Python 等)的课程设置,并称赞这种广度。
  • 也有人建议 prospective students 明确寻找教授 FP 和底层系统的项目,而不只是 Python。

Standard ML 与其他语言的选择

  • Standard ML 被辩护为小巧、稳定,并且非常适合在没有工具链或语言“臃肿”的情况下教授核心 FP 概念。
  • CMU 的历史原因也很重要;SML 是一门研究语言,并且与那里有渊源。
  • 批评者认为 SML 过于冗长,不如 OCaml/F#/Haskell 实用,而且安装困难;支持者则表示它的简洁性胜过缺乏行业使用。
  • 静态类型、代数数据类型、模式匹配以及强类型检查被认为是相较于 Lisp 的关键教学优势。
  • 讨论也围绕“纯”与“不纯”FP 展开,以及 Lisp 是否缺乏引用透明性;另一些人指出,RT 取决于你如何使用语言,而不是语言本身。

课程材料、练习与幻灯片

  • 这些讲座因清晰、富有活力以及高质量幻灯片而受到称赞。
  • 官方作业/实验并未公开,原因包括共同作者署名以及学术诚信方面的顾虑;不过,存在一些更早的作业和配套的 SML “书”。
  • 有人希望有新的、公开可用的练习集,但也指出这很耗时。

FP 的实际问题:副作用、日志、IO

  • 一个反复出现的抱怨是:在纯 FP 中(尤其是 Haskell),像日志这样的微小副作用会把类型“感染”成 IO,并使重构变得复杂。
  • 回应建议:
    • 使用更务实的 FP 语言(OCaml、F#、Erlang)。
    • 在有帮助时接受不纯性(“functional core, imperative shell”)。
    • 使用 monads/type classes(MonadIO、日志 type classes、ST)或调试辅助工具(例如 trace)来管理副作用。
  • 有些人认为 IO-monad 规约很强大;另一些人则觉得它很笨拙。

学习 FP 与图算法

  • 学习者在 Haskell 中处理图算法和循环结构时会遇到困难;他们觉得纯函数式的图代码更慢、也更复杂。
  • 建议包括:
    • 起初更直接地翻译命令式算法。
    • 学习函数式数据结构(例如 Okasaki 风格)、代数图形库以及 store-passing style。
    • 通过 FP 社区(例如特定语言的 Discord)寻求帮助。

FP、理论与实践,以及 LLMs

  • 一些人担心 FP 教学过于理论化,而没有足够面向实用/工业语言;另一些人则更重视概念清晰性,而不是即时适用性。
  • 对于 FP 爱好者是否缺乏现实世界视角,观点不一;也有人反驳说,FP 在生产环境中很有价值,并且与 AI 生成代码配合时尤其有用,因为强类型系统很有帮助。
  • 有评论者认为 LLMs 让编程变得不那么重要;另一些人则认为编程/FP 仍然有价值,就像基础数学一样。