4

当我试图增加我的函数式编程知识时,我发现很难重新想象我用 OOP 语言在函数方面解决的问题的解决方案,特别是在涉及小部件的情况下。像 Project Euler 和 4Clojure 这样的网站非常适合学习处理原始数据的核心功能和技术,但我真正想要的是讨论如何以惯用方式将 OOP 构造转换为 FP 的资源,特别注意识别何时以及如何使用状态。(举一个具体的例子,在 Clojure 中实现钢琴键盘的最佳方法是什么?)

4

4 回答 4

7

我真正想要的是讨论如何以惯用方式将 OOP 结构转换为 FP 的资源

不。这是一个经典的XY 问题

我讨厌类比,但工程中的等价物可能是说您已经掌握了金属制品并想通过在塑料中重新创建相同的形状来学习塑料。实际上,您永远不想将您所知道的内容转化为您正在学习的内容。你真正想做的是学习如何使用新技术解决熟悉的问题。回到工程,好的塑料设计与好的金属设计的形状不同。在编程方面,使用一种范式构建的解决方案永远不会很好地转化为另一种范式。您应该从头开始重新解决问题。

于 2013-08-12T14:51:30.947 回答
3

我不知道有什么书会教我们如何将 OOP 结构转换为函数式结构。只要给自己一些时间,你就会掌握功能性习语。

不要试图在 OOP 代码和 FP 代码之间进行映射。学习一门语言(口语)的最好方法是沉浸在其中并思考它。编程语言也是如此。

三年前,我开始学习 Clojure。那时,我什至不知道 Lisp 是什么,函数式编程语言是什么。我说:嗯?那是什么?我可以用 Lisp 做一些有用的事情吗?我读了很多书,学习了很多,甚至更好的是,我在 Clojure 找到了一份工作!

现在用函数式语言编程对我来说很自然,这很有意义。数据结构和函数编程是我所需要的。简单!

需要记住的一件事是,函数式编程语言在默认情况下并不难,而 OOP 语言在默认情况下并不容易。

于 2013-08-12T14:40:11.717 回答
3

我知道两本书可能会有所帮助:

Brian Marick的“面向对象程序员的函数式编程”

Chas Emerick、Brian Carper 和 Chirstophe Grand 的“Clojure 编程”。第 12 章是关于如何将面向对象的设计模式“翻译”为 Clojure。

于 2013-08-12T14:54:20.193 回答
1

我没有读过这本书,但它听起来很适合你正在寻找的东西(我对我读过的其他实用书架书感到非常满意)

Scala 和 Clojure 中的函数式编程模式

从简介:

通过使用静态类型、类型推断的 Scala 和动态类型的现代 Lisp Clojure,您将获得对函数式编程的广泛理解。对于每种模式,您将首先看到传统的面向对象解决方案,然后深入研究 Scala 和 Clojure 中的功能替换。

回复:您的钢琴问题,您可能会发现 core.async 和 David Nolen 关于使用 core.async 进行 UI 设计的博文(特别是http://swannodette.github.io/2013/07/31/extracting-processes/)很有趣。

在博客文章中,他提出用户界面(以及扩展为钢琴)由 3 个元素组成 - 事件流处理、事件流协调和界面表示。他表明,这些是比典型的 OOP 模型视图控制器更强大的抽象。不过,一切都很新(我认为 core.async 甚至还没有正式发布)。但是,如果您正在寻找惯用的 Clojure 方法来为钢琴建模,我认为它很可能是沿着这些路线......

于 2013-08-12T14:54:29.650 回答