有人声称OOP设计模式与函数式语言无关。是否有代码演示如何在Haskell中实现每个模式?特别是,完整的演示还必须展示如何表示对象,OO多态等等。
答案 0 :(得分:5)
我认为“不相关”的部分主张更多是由于纯面向对象概念与纯函数式编程的不兼容性。
在某些方面,它们都是旨在解决相同问题的概念 - 代码管理,程序员以及以某种方式保持“状态”的组织。
OOP通过尝试将每种状态隔离成一个单独的对象,然后让智能对象相互通信(通过方法,接口等)来解决这个问题。
纯函数式语言通过将问题分解为非常非常小的函数并使数据相当愚蠢来解决这个问题。函数不能访问,编辑或更改任何未特别作为参数给出的内容,以及它对这些内容的作用只能在它返回的内容中看到。
在OOP中,为了解决全局变量的问题,比如一个数据库连接,单例模式表示你将所有数据库连接信息存储在那个对象中,然后只允许它初始化一次,然后只要它是在整个代码库中初始化,相同的对象“出现”并使用相同的变量。
在haskell /函数式编程中,程序的整个结构会有所不同。而是将数据库连接函数隔离,只发生在代码的一部分中。
你可以在OOP类型语言中应用相同的东西,但它更尴尬,语言设计不鼓励它。
答案 1 :(得分:0)
FP和OOP尝试用不同的方法解决相同的问题。 GoF根本不适用,因为它们是OOP模式。通过阅读诸如“功能编程工艺”或“了解大好的Haskell”之类的内容,您将获得更好的服务,以便了解问题如何在功能上得到解决。
我个人认为这两种方法都是有用的东西,并且是Haskell类型类和完全多态函数的忠实粉丝...... DRY的简单性和能力可能简直太棒了。也就是说,Scala在将这两种方法加入单一语言方面做得非常出色,因此您可以使用任何一种方法,具体取决于哪种方法更适合问题。