我如何使用 OCaml 和单子来修复 Slipshow 的最严重缺陷

大约三年多前,“过去的自己”参加了作为软件开发人员的第一次工作面试。他需选择并发送自己写的一段代码作为讨论基础。

  • 过去的自己年轻、热情且毫无经验,编程风格快速且激进,项目中没有用户。
  • 申请的公司是 Tarides,专注于 OCaml 编程语言,他却发送了来自项目Slipshow的最混乱的 JavaScript 函数。
  • 面试中,面试官让他用 OCaml 重写该代码,三年后,作者经过实践和研究给出了答案。

JavaScript 代码及相关内容

  • Slipshow是类似 PowerPoint 的演示软件,基于脚本滚动。
  • 发送给面试官的“最混乱的 JavaScript 函数”实现了在演示中后退的功能,代码复杂且存在问题。
  • 项目中的“美化调度器”简单地跟踪最后执行的步骤,按下右箭头键时执行下一步函数,按下左箭头键时需撤销前一步的副作用,而过去的自己最初的解决方案并不理想,不仅基本的“后退”功能实现不佳,还使引擎难以维护。

OCaml 解决方案

  • 核心思想是执行步骤时除了在演示中的副作用外,还返回一个撤销函数,确保可逆性且不增加复杂性。
  • 定义了“可撤销效果”类型及基本的可撤销值,还定义了如何组合基本的可撤销值,引入了实现超越的语法。
  • 通过测试证明了使用bind函数可以组合原子可撤销计算,使用特殊语法let>可以更自然地编写代码,还以 Slipshow 中的实际引擎为例,展示了使用“可撤销”单子编程复杂脚本的自然性。

结论
作者希望面试官能看到此内容,感谢面试问题开启的有趣旅程,享受用 OCaml 重写项目的过程,还提到自己只精通 OCaml ,对在其他语言中如何实现此功能感到好奇,以及在实际生活中'a undoable类型和bind值因异步性更复杂但原理相同,切换到 OCaml 还有明确异步和非异步的优势。

阅读 6
0 条评论