首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FP中的高阶函数可以解释为某种依赖注入吗?

FP中的高阶函数可以解释为某种依赖注入吗?
EN

Software Engineering用户
提问于 2012-10-24 09:17:39
回答 1查看 1.1K关注 0票数 8

根据这篇文章的说法,在面向对象的编程/设计中,依赖注入涉及到

  • 一个独立的消费者
  • 组件依赖项的声明,定义为接口契约,
  • 根据请求创建实现给定依赖接口的类实例的注入器。

现在让我们考虑函数编程语言中的高阶函数,例如Haskell函数。

代码语言:javascript
复制
filter :: (a -> Bool) -> [a] -> [a]

来自Data.List。这个函数将一个列表转换成另一个列表,为了执行它的工作,它使用(使用)一个外部谓词函数,该函数必须由调用者提供,例如表达式

代码语言:javascript
复制
filter (\x -> (mod x 2) == 0) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

从输入列表中选择所有偶数。

但是,这个结构不是非常类似于上面所示的模式吗?

  • filter函数是依赖的消费者,
  • 函数参数的签名(a -> Bool)是接口契约,
  • 使用高阶的表达式是注入器,在这种情况下,注入契约的实现(\x -> (mod x 2) == 0)

一般来说,在函数式编程中,高阶函数及其使用模式能与面向对象语言中的依赖注入模式联系起来吗?

或者在相反的方向上,依赖注入可以与使用某种高阶函数相比较吗?

EN

回答 1

Software Engineering用户

发布于 2012-10-24 09:48:01

是的,您的示例肯定代表了一种简单的依赖注入形式。

这种形式并不令人印象深刻--在OO语言中,您可以通过拥有将它们的依赖项作为参数(或在构造函数中要求它们的类)的方法来进行同样的操作。当您到处传递依赖项时,这会变得非常困难。因此,依赖注入容器负责构建包含所有依赖项的整个对象图。我不确定什么是FP等价物。

或者在相反的方向上,依赖注入可以与使用某种高阶函数相比较吗?

我会这么说,是的。依赖注入试图解决的问题是,当依赖项被硬编码时缺乏灵活性,如果您有单独的removeOddNumbersFromListgetAdminUsersFromList等函数,就会发生这种情况。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/171156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档