客观地思考与功能性

时间:2013-08-12 14:22:11

标签: clojure functional-programming

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

4 个答案:

答案 0 :(得分:7)

  

我真正喜欢的是讨论如何将OOP结构惯用于FP的资源

别。这是一个经典的XY problem

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

答案 1 :(得分:3)

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

不要尝试在OOP代码和FP代码之间进行映射。学习语言(口语)的最佳方式是让自己沉浸其中并思考它。编程语言也是如此。

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

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

有一件事要记住,默认情况下函数式编程语言并不困难,默认情况下OOP语言并不容易。

答案 2 :(得分:3)

我知道两本可能有用的书:

Brian Marick

"Functional Programming for the Object-Oriented Programmer"

Chas Emerick,Brian Carper和Chirstophe Grand的

"Clojure Programming"。第12章是关于如何将面向对象的设计模式“转换”为Clojure。

答案 3 :(得分:1)

我没有读过这本书,但这听起来非常适合你所寻找的东西(而且我对我读过的其他实用书架书非常满意)

Functional Programming Patterns In Scala And Clojure

来自blurb:

  

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

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

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