Dependency injection 如何在纯函数式编程中交换函数(例如用于测试)

Dependency injection 如何在纯函数式编程中交换函数(例如用于测试),dependency-injection,functional-programming,Dependency Injection,Functional Programming,我试图理解什么是FP,而不是OOP中良好的旧依赖项注入。 假设我有以下应用程序(伪代码) app()是应用程序启动的地方。它允许用户注册和列出用户帖子(无论什么)。这两个函数是由其他几个函数组成的(register一步一步地完成,而list post实际上是由它们组成的(至少我是这样理解函数组成的) 现在我想测试这些东西(registerUser和listPosts),并希望有存根函数,这样我就不会调用db等——你知道,通常的测试东西。 我知道可以将函数传递给函数,例如 registerUser

我试图理解什么是FP,而不是OOP中良好的旧依赖项注入。 假设我有以下应用程序(伪代码)

app()
是应用程序启动的地方。它允许用户注册和列出用户帖子(无论什么)。这两个函数是由其他几个函数组成的(register一步一步地完成,而list post实际上是由它们组成的(至少我是这样理解函数组成的)

现在我想测试这些东西(
registerUser
listPosts
),并希望有存根函数,这样我就不会调用db等——你知道,通常的测试东西。 我知道可以将函数传递给函数,例如

registerUser(validateFn, persistFn, notifyFn, u) 
并将其部分应用,使其看起来像
registerUser(u)
,其他功能关闭,等等。但这一切都需要在应用程序引导级别上完成,就像在OOP中一样(连接依赖项和引导应用程序)。看起来手动执行此操作需要花费很多时间和大量的样板代码。是否有明显的遗漏?是否有其他方法可以做到这一点

编辑:

我看到IO不是一个很好的例子。所以如果我有一个由其他几个函数组成的函数,其中一个函数很重(就计算而言),我想交换它呢


简单地说,我正在寻找做DI工作的FP方法。

回答这个问题的方法是去掉“依赖注入”这个短语从根本上考虑。将接口写为每个组件的类型。实现具有这些类型的函数。根据需要替换它们。这没有什么神奇之处,类型类之类的语言功能使编译器能够轻松确保可以替换接口中的方法


前面的Haskell特定答案显示了如何在API中使用Haskell类型:

Ok,但我想在这种情况下并不重要。如果我想用几个其他构建块组成函数逻辑(它们可能不执行任何IO),该怎么办?另外,我最终需要在某个时候调用db,因此这必须在某个地方进行处理,尽管如此,它仍然无法以任何方式回答我的问题(或者我完全没有理解你的观点)DI不是一种编程语言概念,它是一种工具概念。这基本上意味着有某种编译器插件或其他与语言规范分离的工具用于进行DI。因此,FP——一种编程范式——不能有DI,尽管某些特定的FP语言工具本身可能支持DIways@Ankur不同意——依赖dency注入是一种设计模式,它不需要工具或插件。
registerUser(validateFn, persistFn, notifyFn, u)