在函数式编程中,什么是函子?

2023-12-08

我在阅读有关函数式编程的各种文章时多次遇到“函子”一词,但作者通常假设读者已经理解该术语。在网络上环顾四周,要么提供了过多的技术描述(请参阅维基百科文章)或令人难以置信的模糊描述(请参阅此处有关函子的部分ocaml-教程网站).

有人可以定义这个术语,解释它的用途,或者提供一个如何创建和使用函子的示例吗?

Edit:虽然我对这个术语背后的理论感兴趣,但我对这个概念的实施和实际使用的兴趣不如对理论的兴趣。

Edit 2:看起来好像存在一些跨术语:我特指的是函数式编程的函子,而不是 C++ 的函数对象。


“函子”这个词来自范畴论,范畴论是一个非常普遍、非常抽象的数学分支。函数式语言的设计者至少以两种不同的方式借用了它。

  • 在 ML 语言系列中,函子是一种采用一个或多个其他模块作为参数的模块。它被认为是一项高级功能,大多数初学者都很难使用它。

    作为实现和实际使用的示例,您可以将您最喜欢的平衡二叉搜索树形式一劳永逸地定义为函子,并且它将采用提供以下功能的模块作为参数:

    • 二叉树中使用的键的类型

    • 按键全排序功能

    一旦完成此操作,您就可以永远使用相同的平衡二叉树实现。 (存储在树中的值的类型通常是多态的——树除了复制它们之外不需要查看值,而树肯定需要能够比较键,并且它从函子的参数。)

    ML 函子的另一个应用是分层网络协议。该链接是 CMU Fox 小组发表的一篇非常棒的论文;它展示了如何使用仿函数在较简单的层类型(如 IP 甚至直接通过以太网)上构建更复杂的协议层(如 TCP)。每一层都被实现为一个函子,将其下面的层作为参数。软件的结构实际上反映了人们思考问题的方式,而不是只存在于程序员头脑中的层次。 1994年这部作品出版时,轰动一时。

    有关 ML 函子的实际应用示例,您可以参阅论文机器学习模块狂热,其中包含一个可发布的(即可怕的)函子工作示例。要对 ML 模块系统进行精彩、清晰、清晰的解释(以及与其他类型的模块的比较),请阅读 Xavier Leroy 1994 年发表的精彩 POPL 论文的前几页清单类型、模块和单独编译.

  • 在 Haskell 和一些相关的纯函数式语言中,Functor is a 类型类别。当类型提供具有某些预期行为的某些操作时,该类型属于某个类型类(或者更技术地说,该类型“是该类型类的实例”)。一种T可以属于班级Functor如果它具有某些类似集合的行为:

    • 方式T通过另一种类型进行参数化,您应该将其视为集合的元素类型。完整集合的类型类似于T Int, T String, T Bool,如果您分别包含整数、字符串或布尔值。如果元素类型未知,则将其写为类型参数 a, as in T a.

      示例包括列表(零个或多个类型的元素a), the Maybetype(类型的零个或一个元素a),类型元素的集合a, 类型元素数组a,包含类型值的各种搜索树a,以及您能想到的许多其他内容。

    • 另一个财产是T必须满足的是,如果你有一个类型的函数a -> b(元素上的函数),那么您必须能够采用该函数并在集合上产生相关的函数。您与操作员一起执行此操作fmap,这是由每个类型共享的Functor类型类。该运算符实际上是重载的,所以如果你有一个函数even与类型Int -> Bool, then

      fmap even
      

      是一个重载函数,可以做很多奇妙的事情:

      • 将整数列表转换为布尔值列表

      • 将整数树转换为布尔树

      • Convert Nothing to Nothing and Just 7 to Just False

      在 Haskell 中,该属性通过给出以下类型来表示:fmap:

      fmap :: (Functor t) => (a -> b) -> t a -> t b
      

      我们现在有一个小的t,这意味着“任何类型Functor class."

    长话短说,在 Haskell 中函子是一种集合,如果给它一个元素上的函数,fmap会给你一个关于集合的函数。正如你可以想象的,这是一个可以广泛重用的想法,这就是为什么它被祝福成为 Haskell 标准库的一部分。

像往常一样,人们不断发明新的、有用的抽象,你可能想研究一下应用性的函子,最好的参考可能是一篇名为带有效果的应用程序编程作者:康纳·麦克布莱德和罗斯·帕特森。

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

在函数式编程中,什么是函子? 的相关文章

  • D 中的特征可以用于类型类吗?

    我是 D 新手 我正在寻找一种使用类似 Haskell 的类型类进行编程的好方法 例如D 中的函子 幺半群等 Tango 或 Phobos 中是否实现了类似的功能 我听说过可以对某些属性进行编译时类型检查的特征 它们可以用于类型类吗 我尝试
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • 阻塞事件循环

    我正在通过 Nodeschool 参加 函数式 Javascript 研讨会 其中一项练习的标题是 阻止事件循环 我很难理解它 通过过去的练习 我确保真正尝试理解解决方案 这样如果我必须重做问题 我就会理解如何解决它 而不是第一次就破解它
  • Kotlin 的不同类型的 reduce() 函数

    我正在查看数组扩展函数并发现reduce one inline fun
  • 返回元组的第一个元素

    假设我创建一个将两个整数相加的函数 def addInt a Int b Int Int Int val x a b x 2 我回来了 result 2 故意为了这个问题 现在我想创建一个仅返回 x 的变量 val result addIn
  • OCaml 3.12 中的一流模块:它们将使哪些事情变得更容易(或可能)?

    我听说 OCaml 3 12 中即将推出 一流模块 他们将提供什么优势 哪些孩子的事情会变得更容易 他们试图解决什么问题 一个简单的例子就足够了 这只是一个可能的应用程序 但一流的模块可以轻松地对存在类型进行编码 基本上是一个模块打包存在类
  • 如何使用 swift flatMap 从数组中过滤掉选项

    我对 flatMap 有点困惑 添加到 Swift 1 2 假设我有一些可选类型的数组 例如 let possibles Int nil 1 2 3 nil nil 4 5 在 Swift 1 1 中 我会做一个过滤器 然后是一个像这样的地
  • python函数返回函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • C++ 中的函数指针与仿函数

    使用函子和函数指针有什么区别 例如 Functor struct add x int x add x int y x y int operator int y return x y Function int func int x retur
  • Ocaml 模块和包的区别

    我基本上是在尝试遵循这篇文章中的 stackoverflow 答案 OCaml 中 HttpRequest 的最佳模块是什么 https stackoverflow com questions 14134116 what is the be
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • OCaml 中的不可变变量

    我正在学习 OCaml 我对变量的不变性有点困惑 根据我正在读的书 变量是不可变的 到目前为止一切顺利 但到底为什么我可以这样做 let foo 42 let foo 4242 我缺少什么 我认为最好的解释方法是举个例子 考虑以下代码 在
  • scala 返回列表中的第一个 Some

    我有一个清单l List T1 目前我正在执行以下操作 myfun T1 gt Option T2 val x Option T2 l map myfun l flatten find gt true The myfun函数返回 None
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来

随机推荐

  • 在 Android 中使用 NanoHTTPD

    我正在尝试使用 NanoHTTP 来提供 HTML 文件 然而 NanoHTTP 相对来说没有文档记录 而且我对 Android 还很陌生 我的问题是 我在哪里存储 html 文件 以及如何使用 NanoHTTP 提供它 答案很晚 但可能对
  • 如何从 Java 9+ 中的目录动态加载模块

    我一直在开发一个带有基于插件的系统的软件 用户可以在其中编写自己的插件 我对 JMPS 很陌生 但我想使用 JMPS 而不是 OSGi 来实现这一点 制作了一个单独的 API 模块 甚至创建了一个测试插件 插件以文件名 someplugin
  • UTC_TIMESTAMP() 是否受夏令时影响?

    我正在编写一个具有时段预订系统的应用程序 用户可以位于不同的时区 因此我需要以 UTC 时间将值存储在数据库中 我想知道如何UTC TIMESTAMP 是在MySQL中计算的 可靠吗 如果服务器时区位于夏令时地区UTC TIMESTAMP
  • Laravel 多文件上传验证

    我目前正在以一种形式工作 我在多个文件上传验证方面遇到一些问题 我的表单中只有一个字段允许上传多个文件
  • 如何在 pyplot 中的分组条形图中标记组?

    我想在 pyplot 中做类似以下的事情 我也可以在其中标记条形图和组 我能够标记条形 但不知道如何标记组 谢谢 默认的Seaborn 条形图会创造一个传说来显示岁月 import numpy as np import pandas as
  • C# - httpWebRequest 流的大小是否有限制?

    我正在尝试构建一个应用程序 使用 httpwebrequests 从自定义网络服务器下载一个小二进制文件 20 25 KB 这是服务器端代码 Stream UpdateRequest context Request InputStream
  • 从 HEVC 参考软件获取一些信息

    我是 HEVC 新手 现在正在了解参考软件 现在正在研究帧内预测 编码后我需要获取如下信息 给定 CTU 的 CU 结构 对于计算期间的每个 CU 它是信息 例如 QP 值 选择的亮度模式 选择的色度模式 CU 是否处于 CTU 分割决策的
  • 如何从我不拥有的画布中获取像素数据?

    我正在尝试从画布获取像素 RGBA 数据以进行进一步处理 我认为画布实际上是一个 Unity 游戏 如果这有什么不同的话 我正在尝试用游戏的画布来做到这一点颤抖和坐立不安 我用读取像素方法从context 这是我尝试过的 var examp
  • 我可以像在asp.net core mvc中一样使用service在blazor中操作dbcontext吗?

    在我的asp net core mvc项目中 我通常会使用这个服务来进行业务操作 services AddDbContextPool
  • 循环 switch 语句

    我是 C 新手 我在控制台应用程序中有一个 菜单 现在 当我完成从菜单中选择一个项目并执行该菜单项所需的操作时 我想循环并再次显示菜单 以便用户可以选择不同的菜单项 我的菜单上有一个退出选项 我只想用它来退出 我尝试过 while 循环 但
  • Netbeans插件解析api

    如何安装netbeans插件解析API 以下是我尝试在 Netbeans 中安装 按需扫描 插件时出现的错误 Some plugins require plugin Parsing API to be installed The plugi
  • bash 包装器将 stderr 设为红色

    Bash 支持颜色 即 033 31m切换到红色并且 033 0m切换回无色 我想制作一个小型的 bash 包装器 它可以可靠地将 stderr 输出为红色 即它应该将 033 31m之前和 033 0m在来自 stderr 的所有内容之后
  • 带有子解析器和可选位置参数的 Python argparse

    我想要一个带有子解析器的程序 它可以处理特定的参数 同时还为之前的解析器保留一些位置和可选参数 事实上 我真正想要的只是一个选项 我的意思是 一个有效的子解析器或一个有效的本地参数 我希望拥有的东西的例子 Program sectionNa
  • wmic 命令的批处理脚本中的文本乱码

    我正在尝试运行批处理脚本来获取基本的计算机信息 如 CPU RAM 和活动网卡 这是我的代码 Echo OFF set newline echo echo Manufacturer Information gt test1 txt syst
  • 如何使用 cPanel 托管 Django 网站?

    我是网站托管领域的新手 尤其是 cPanel 平台 我有一个使用Python语言开发的网站 它也使用Django 我在 cPanel 中托管了这个网站 但它似乎不起作用 当我浏览我的网站域 www def com 时 现在它显示 site
  • 如何在Java中实现无穷大?

    Java 是否有任何东西可以代表每种数值数据类型的无穷大 它是如何实现的 以便我可以用它进行数学运算 E g int myInf infinity However it is done myInf 5 returns infinity my
  • PHP 表单提交时自动跳转到 HTML 锚点

    我正在尝试将表单添加到我的索引页面中 以便当您单击 提交 时 页面重新加载时它将自动返回到表单 现在 如果页面上有任何错误 它会在表单上方显示它们 并给出一些感谢信息 我目前的index html 页面有以下内容
  • BizTalk Schema 开发 - 十六进制值 0x19,是无效字符

    我有一个架构元素节点 如下所示
  • 如何使用 PLSQLDeveloper 窗口打印 SYS_REFCURSOR?

    在下面的查询中如何在 PL SQL SQL Window 中获取 IO CURSOR 值 DECLARE SOME VAR 1 VARCHAR2 20 SOME VAR 2 VARCHAR2 20 SOME VAR 3 DECIMAL IO
  • 在函数式编程中,什么是函子?

    我在阅读有关函数式编程的各种文章时多次遇到 函子 一词 但作者通常假设读者已经理解该术语 在网络上环顾四周 要么提供了过多的技术描述 请参阅维基百科文章 或令人难以置信的模糊描述 请参阅此处有关函子的部分ocaml 教程网站 有人可以定义这