我的相关问题框溢出了函数式编程问题。在审查了最相关的内容之后,我仍然很想听听以下内容的意见:
您如何考虑使用函数式语言构建应用程序?
我不是在谈论语言特定的语法。我对概念组织范式(例如面向对象)感兴趣。
与许多人一样,我第一次接触封装和代码重用来自OO背景。由于我一直在研究不同的语言,函数式编程确实引起了我的注意。我开始意识到不变性,高阶函数等的好处。但是我仍然失去了对如何构建功能应用程序而不依赖于OO概念的感觉。实际上,我见过的许多功能性例子与意大利面条代码有更多共同之处,尽管我确信这是由于示例的简单性而不是功能方法中的任何固有缺陷。
这个问题是“什么时候我应该使用函数式编程”的亲属,但我已经满足于自己的功能方法,尽管在某些领域有利有弊,但几乎可用于任何你想要的东西。我只是难以想象复杂应用程序的大图片组织。
答案 0 :(得分:21)
在20世纪70年代后期,Barbara Liskov和其他人开发了大量的“面向对象设计”技术,这些技术至今仍被广泛使用,并且在功能编程中不变。它们最容易应用于具有显式接口和实现的语言,这意味着标准ML(其中接口称为“签名”,实现称为“结构”或“仿函数”)或Objective Caml(其中接口称为“模块类型”) “和实现被称为”模块“)。如果您更喜欢Scheme,那么由Matthew Flatt和Matthias Felleisen开发的“单元”语言已构建到PLT Scheme中,是表达大规模函数的一种非常好的方式。
简而言之:
围绕抽象类型(OO中的类,FP中的“抽象类型”)以及对这些类型的操作组织应用程序。
使用封装机制(OO中的类,FP中的模块)来隐藏抽象类型的表示。
构建应用程序,以便每个实现通过其接口间接依赖于其他实现。这样就可以限制构建或修改任何一个应用程序时必须理解的代码量。
去城里!
主要区别在于,在编写函数式程序时,不要使用继承来重用实现。相反,您使用高阶函数,或者使用modules which take other modules as parameters。
摘要:在架构层面上,没有太大区别,但在使用函数式语言时,您可能需要更加努力地找到所需的封装机制。
答案 1 :(得分:2)
大多数整体设计模式完全适用:
分离关注;模型控制演示(所有变体);分层架构;输入 - 处理 - 输出等
一旦你将一个大问题分解成较小的问题,较小的问题就是处理从源到目的地表示的各种转换。
我发现输入流程输出模式和转换管道模式有帮助。