我正在尝试理解什么是来自OOP的良好旧依赖注入的FP替代方案。 假设我有以下应用程序(伪代码)
app()
是应用程序启动的地方。它允许用户注册和列出用户帖子(无论如何)。这两个函数由几个其他函数组成(寄存器一步一步地执行,命令性地,而列表帖子确实组成它们(至少这是我理解函数组合的方式)。
app()
registerUser(u)
validate(u)
persist(u)
callSaveToDB(u)
notify(u)
sendsEmail
listPosts(u)
postsToView(loadUserPosts(findUser(u)))
现在我想测试这些东西(registerUser
和listPosts
),并且想要使用存根函数,这样我就不会调用db等 - 你知道,通常的测试内容。
我知道可以将函数传递给函数,例如
registerUser(validateFn, persistFn, notifyFn, u)
并将其部分应用,因此它看起来像registerUser(u)
,其他功能已关闭,依此类推。但这一切都需要在应用程序启动级别上完成,就像它在OOP中一样(连接依赖关系和引导应用程序)。看起来手动这样做需要花费大量的样板代码。那里有什么明显的东西吗?还有其他办法吗?
编辑:
我看到IO有一个很好的例子。那么如果我的函数由其他几个函数组成,并且其中一个函数非常繁重(就计算而言)而且我想交换它呢?
简单 - 我正在寻找FP做DI事的方式。
答案 0 :(得分:1)
回答这个问题的方法是删除短语"依赖注入"并从根本上考虑它。将接口记为每个组件的类型。实现具有这些类型的函数。根据需要更换它们。没有什么神奇之处,类型类等语言功能使编译器可以轻松确保您可以替换接口中的方法。
以前针对Haskell的答案显示了如何为API使用Haskell类型:https://stackoverflow.com/a/14329487/83805