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

时间:2014-11-02 14:28:28

标签: dependency-injection functional-programming

我正在尝试理解什么是来自OOP的良好旧依赖注入的FP替代方案。 假设我有以下应用程序(伪代码)

app()是应用程序启动的地方。它允许用户注册和列出用户帖子(无论如何)。这两个函数由几个其他函数组成(寄存器一步一步地执行,命令性地,而列表帖子确实组成它们(至少这是我理解函数组合的方式)。

app()

  registerUser(u)
    validate(u)
    persist(u)
      callSaveToDB(u)
    notify(u)
      sendsEmail

  listPosts(u)
    postsToView(loadUserPosts(findUser(u)))

现在我想测试这些东西(registerUserlistPosts),并且想要使用存根函数,这样我就不会调用db等 - 你知道,通常的测试内容。 我知道可以将函数传递给函数,例如

registerUser(validateFn, persistFn, notifyFn, u) 

并将其部分应用,因此它看起来像registerUser(u),其他功能已关闭,依此类推。但这一切都需要在应用程序启动级别上完成,就像它在OOP中一样(连接依赖关系和引导应用程序)。看起来手动这样做需要花费大量的样板代码。那里有什么明显的东西吗?还有其他办法吗?

编辑:

我看到IO有一个很好的例子。那么如果我的函数由其他几个函数组成,并且其中一个函数非常繁重(就计算而言)而且我想交换它呢?

简单 - 我正在寻找FP做DI事的方式。

1 个答案:

答案 0 :(得分:1)

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

以前针对Haskell的答案显示了如何为API使用Haskell类型:https://stackoverflow.com/a/14329487/83805