装饰器模式的功能等效吗?

2024-01-05

与装饰器设计模式等效的函数式编程是什么?

例如,你会怎么写这个特殊的例子 https://en.wikipedia.org/wiki/Decorator_pattern#First_example_(window/scrolling_scenario)功能性风格?


在函数式编程中,您可以将给定函数包装在新函数中。

给出一个与您的问题中引用的类似的人为的 Clojure 示例:

我原来的绘图功能:

(defn draw [& args]
  ; do some stuff 
  )

我的函数包装器:

; Add horizontal scrollbar
(defn add-horizontal-scrollbar [draw-fn]
  (fn [& args]
    (draw-horizontal-scrollbar)
    (apply draw-fn args)))


; Add vertical scrollbar
(defn add-vertical-scrollbar [draw-fn]
  (fn [& args]
    (draw-vertical-scrollbar)
    (apply draw-fn args)))

; Add both scrollbars
(defn add-scrollbars [draw-fn]
  (add-vertical-scrollbar (add-horizontal-scrollbar draw-fn)))

它们返回一个新函数,可以在使用原始绘图函数的任何地方使用,但也可以绘制滚动条。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

装饰器模式的功能等效吗? 的相关文章

  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • C# 中我们需要定点组合器吗?

    我在 C 中使用递归 lambda 并在网络上找到了两种执行此操作的方法 一种方法使用定点组合器 http en wikipedia org wiki Y combinator而另一个则没有 在下面的代码中 f1是使用组合器构建的 f2是直
  • 如何向 F# 项目添加第三方 dll 引用?

    我正在向我的 F 项目添加第三方 dll 引用 我在引用中添加了 dll 当我使用它时 即突出显示代码并执行 Alt Ent 我收到错误 命名空间或模块 AZROLESLib 未定义 我是不是错过了什么 简而言之 你必须使用 r path
  • Parsec 函数“parse”和类“Stream”的类型签名

    约束条件是什么 Stream s Identity t 下面的类型声明是什么意思 parse Stream s Identity t gt Parsec s a gt SourceName gt s gt Either ParseError
  • Common Lisp 中的原子和 Clojure 中的原子有什么区别?

    下列page http clojure org atoms讨论原子在 Clojure 中的工作原理 它并没有详细说明 Clojure 和其他 lisp 方言中原子之间的差异 Common Lisp 中的原子和 Clojure 中的原子之间的
  • 与 google guice 相当的 clojure 是什么?

    我遇到了 google guice 但无法真正理解它以及它的作用 尽管它周围似乎有很多炒作 我希望从 clojure 的角度了解该库 以及为什么在 clojure 应用程序中需要 不需要它 以及该语言中是否内置了类似的内容 由于 Java
  • 将一个列表(n 元组或列表)与另一个列表(也可以是数组)缩放的惯用 F# 方法是什么?

    Given let weights 0 5 0 4 0 3 let X 2 3 4 7 3 2 5 3 6 我想要的是 wX 0 5 2 3 4 0 4 7 3 2 0 3 5 3 6 我想知道一种使用列表和数组来执行此操作的优雅方法 欢迎
  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • 如何在没有接口的情况下模拟多重继承?

    如何在不使用接口的情况下在 C 中模拟多重继承 我确实相信 接口能力不适用于此任务 我正在寻找更多面向 设计模式 的方式 就像 Marcus 所说 使用接口 扩展方法来制作像 mixins 这样的东西可能是你目前最好的选择 另请参阅 使用接
  • DI Control-Freak 反模式:难以理解

    我正在阅读 Mark Seemann 写的 NET 中的依赖注入 但我无论如何也无法理解这一点 虽然new当涉及到 VOLATILE 时 关键字是一种代码味道 依赖性 您无需担心将其用于稳定 依赖性 这new一般来说 关键字不会突然变得 非
  • 排序映射对现有键返回 nil 值

    我尝试从排序映射中按键获取值 并按其返回的值进行比较nil def tmap 1 v 1 2 v 2 3 v 3 def tmap sorted apply sorted map by let val comp compare get in
  • Haskell 中的多态函数作为参数

    我有一个带有两个构造函数的 ADT 一个包裹着一个Double和一个包裹着Integer 我想创建一个函数 它采用一元函数Numtypeclass 并返回一个函数 该函数将该一元函数应用于我的 ADT 的内容 我试过这个 data X Y
  • Visual Studio 2019 F# NU1101 无法找到包 FSharp.core

    我刚刚开始使用 Microsoft Visual Studio 和 F 我已尽可能地遵循他们的教程 但是当我尝试运行代码时 他们告诉我收到错误 NU1101 Unable to find package FSharp Core No pac
  • F# 查询,按单列对多个值进行分组

    我有一个 F sql 查询 需要对每组中的两列求和 let financials query for data in dbData do groupValBy data earning data losses data store into
  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n
  • 生成 .tail IL 指令的简单 F# 代码是什么?

    我想看看 tailIL 指令 但我一直在编写的使用尾部调用的简单递归函数显然已优化为循环 我实际上是在猜测这一点 因为我不完全确定反射器中的循环是什么样的 我绝对没有看到任何 tail不过操作码 我在项目的属性中检查了 生成尾部调用 我还尝
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • 如何在 Clojure 中将字符串转换为函数?

    我一直在努力Clojure 问题 135 中缀计算器 http www 4clojure com problem 135 基本上是一个简化的中缀到前缀算术计算器 7 2 5 我按照指定解决了问题 但这让我想知道 如果参数作为字符串提供怎么办
  • Clojure 宏总是泄漏吗?

    如果你读过这个问题宏 gt 带有匿名函数 https stackoverflow com questions 10740265 macro with anonymous functions 10740411 comment13981517

随机推荐

  • Stripe 货币 - 所有金额均以美分/百分之一为单位,还是取决于货币?

    我目前正在编写代码以从不同的支付处理器迁移到 Stripe 我知道当货币是美元时 stripe 使用美分 所以条纹 1000 美元 10 00 美元 欧元也是如此 我假设 stripe 1000 EUR 10 00 但日元呢 100 日元大
  • 如何显示微调器的图标并单击打开列表

    我想显示微调器的图标 然后单击打开突出显示所选位置的列表 这是我在微调器中添加项目的方法 public void addItemsOnSpinner try List
  • Python - 当包具有相同名称时从文件导入

    当我开始我的Python项目时 我做了一些愚蠢的事情 我将我的主文件命名为project py 并将一堆逻辑存储在一个也称为project的包中 这是目录结构 project py project other files 问题是 现在我需要
  • WebRTC:匹配最近的同行

    给定一个公共 IP 地址 对等点 A 和许多其他公共 IP 地址 IPv4 和 IPv6 地址的混合 列表 将对等点 A 的 IP 地址匹配的最简单方法是什么 n最近的对等点 而无需让对等点手动相互 ping 通以进行延迟基准测试 我认为使
  • 在 Phonegap 应用程序中获取 Wordpress 帖子时出现 Access-Control-Allow-Origin 错误

    希望有人可以帮助我在phonegap中开发移动应用程序时解决以下问题 我正在尝试从 WordPress 安装中读取帖子 但是当我在 chrome 上运行我的 index html 页面时出现此错误 XMLHttpRequest 无法加载 O
  • 如何通过点击按钮隐藏div?

    在我的 angular js 学习项目中 我想隐藏一个 div 并在单击按钮时显示另一个 div 在此代码中 我希望第一个 div 在单击时隐藏 甚至被销毁 并显示第二个 div 基本上我想要在我的应用程序中从第 1 页转到第 2 页的用户
  • 尝试在powershell中结合替换和新项目

    我有一个任务要更改目录中的一些配置文件 需要更改的文件有7个 全部以 Monitoring Tran xx 开头 这些文件中有某些值 TransactionID 01 AgreedResponseTime 500 SearchProfile
  • 使用 PHPstorm 7 文件观察器将 SCSS / SASS 转换为特殊文件夹中的 CSS

    我使用 PHPstorm 6 并且我的 SCSS 文件被编译到 CSS 文件夹中 所以我有 css main css img js scss main scss variables scss Hier are my definitions
  • 如何找到具有相同子节点的节点

    我有以下 xml 请注意 节点 n1 和 n3 具有相同的子节点 顺序可以不同 如何编写 XSL 转换来识别此类节点
  • 将函数传递给模板组件

    是否可以将函数传递给stencilJs成分 就像是 Prop okFunc gt void 我有一个模态 想要动态调用传递的函数Ok在模态页脚中单击按钮 就像onClick在普通的 HTML 按钮上 是的你可以 这只是正常现象 Prop 声
  • C 套接字发送/接收缓冲区类型

    我正在使用unix套接字 当我的缓冲区是char类型时 即发送和接收字符串 我可以发送 和recv 数据 我使用了 Beej 的套接字指南 所使用的示例用于发送 接收字符串 现在我想在一条消息中发送 接收不同类型的数据 例如 假设在一条消息
  • 在matlab中进行FFT移位的有效方法(不使用fftshift函数)

    http www mathworks com help techdoc ref fftshift html http www mathworks com help techdoc ref fftshift html 如果您检查该链接 这就是
  • 如何以编程方式更改android中图像按钮的大小

    我必须以编程方式创建几个按钮图像按钮 但我不知道如何更改它们的大小 向左和向右更改不起作用 用这个 LinearLayout LayoutParams params button getLayoutParams params width 8
  • 在 HTML 中将表格单元格拆分为两列

    我有下表 table border 1 tr th Header th th Header th th Header th tr tr td nbsp td td nbsp td td Split this one into two col
  • 当未找到特定日期的记录时,返回结果集中的行

    我创建了一个查询来返回以下输出 Date Day Sale Qty Purchase Qty Transfer Qty 05 04 2015 1 11 0 0 07 04 2015 3 0 16 0 08 04 2015 4 12 14 1
  • 在 JavaScript 中使用高阶函数中的原型函数

    我正在尝试使用reduce 连接数组数组 我想我可以使用 Array prototype concat 函数 如下所示 arr 1 2 3 arr reduce a b gt Array prototype concat a b 效果很好并
  • Azure Blob 列表分页

    我的容器中有 3000 个文件 在我的 gridview 中 我显示容器 blob 列表 但 3000 太多了 对性能不利 我的想法 我需要一个分页代码 例如我的网格页面大小是 50 我将在 gridview 中的第一页的容器中显示前 50
  • 具有 Windows 安全性的 Python Selenium 网页

    我正在尝试定期从我组织的网站自动下载一些 CSV 他们非常友善 没有为我提供后端数据库访问或 API 所以我不得不拼凑一些东西来帮我处理这个问题 该网站是一个 Oracle PeopleSoft 网站 会提示Windows Security
  • 在 iPython Notebook 中触发文件下载

    给定一个在外部服务器上运行的 iPython 笔记本 有没有办法触发文件下载 我希望笔记本能够启动将外部服务器上的文件下载到本地渲染笔记本的位置 或者执行从笔记本工作区到文本文件的直接字符串转储 下载到本地 IE 一个强大的工具是 Note
  • 装饰器模式的功能等效吗?

    与装饰器设计模式等效的函数式编程是什么 例如 你会怎么写这个特殊的例子 https en wikipedia org wiki Decorator pattern First example window scrolling scenari