功能语言中的分解(模块化)

时间:2010-09-22 22:57:14

标签: dependency-injection functional-programming components

有一个想法:函数(在FP中)可以像OOP中的组件一样组成。对于OOP中的组件,我们使用接口。对于函数,我们可以使用委托。目标是实现分解,模块化和可互换性。我们可以使用依赖注入来使其更容易。

我试图找到关于这个主题的东西。没运气。可能是因为没有足够大的功能程序需要这个?在搜索用FP编写的企业级应用程序时,我找到了这个列表。 Functional Programming in the Real Worldthis paper。 我希望我错过了FP的杀手级应用程序,这个应用程序足够大,值得分解。

问题:你能否展示出真实的FP应用程序(最好是开源),它将分解用于模块?

Bonus chatter:使用的常用模式是什么?什么样的功能通常会分解成单独的模块?这些实现是否曾被用于测试目的?

2 个答案:

答案 0 :(得分:5)

前段时间我正在学习F#并想知道相同的主题,所以我问过quality open source projects to learn from

你在功能编程中没有看到任何类似于依赖注入的原因是它只是“自然”,因为你只是通过传递或编写函数来“注入依赖”。或者正如本文所说,“Functional dependency injection == currying”,但这只是一个机制。

模拟框架不是必需的。如果你需要模拟一些东西,你只需传递一个“存根”函数。

另见this question about real-world Scala applications

答案 1 :(得分:4)

要么我们正在谈论交叉目的(可能:我对OOP术语不太熟悉),或者你对功能编程缺失了很多。模块和抽象(即可互换性)基本上是用函数式语言CLU发明的。关于抽象类型的开创性论文是James Morris的Protection in programming languagesTypes are not sets。后来,模块系统和抽象方面的大多数改进都来自函数式编程世界,通过类似ML的语言。

功能编程的杀手级应用程序通常被认为是符号操作。大多数函数式语言编译器都是用语言编写的,因此您可以查找自己喜欢的函数式语言实现的来源。但是,几乎任何重要的程序(功能与否)都是在某种程度上以模块化方式编写的 - 也许我错过了“分解”的含义?模块化将更加明显,并使用高级模块系统在强类型语言中使用更高级的概念,例如Standard MLObjective Caml