什么样的函数被认为是“可组合的”?

2024-05-10

维基百科文章函数组合(计算机科学) https://en.wikipedia.org/wiki/Function_composition_(computer_science) says:

就像数学中通常的函数组合一样,每个函数的结果作为下一个函数的参数传递,最后一个函数的结果是整体的结果。

我对此有两个问题:

  1. 可组合函数必须同时具有参数和返回值吗?

    所以以下函数不是:

    def doNothing(): Unit = ()
    def myName(): String = "My name"
    def eat(food:String): Unit = ()
    

    我的理解正确吗?

  2. 这个功能会产生副作用吗?

    def hello(name:String):String = {
      println("name: " + name) // side-effect
      name + "!"
    }
    

    我们仍然认为它是“可组合的”吗?


数学的正式语言与编程的口语语言的混合使这些对话变得困难。您在这里处理两个上下文加载的单词:“可组合”和“函数”。

数学中的函数组合

“函数”的数学概念A → B是从某个集合 A 到某个集合 B 的映射,“函数组合”是由下式表示的特定操作。对于一些f: A → B and g: B → C, g∘f是一个函数A → C这样(g∘f)(x) = g(f(x))对全部x in A。如果任意两个函数的域/共域以这种方式匹配(换句话说,这样的一对函数“可以组合”),则可以为任意两个函数定义这种组合,并且我们通过声明“函数是可组合的”来描述这一点。

可组合性——在编程中

作为一个定性术语,我们经常在软件中使用“可组合性”来描述一组组合可以通过组合小东西来构建大东西的能力。从这个意义上说,程序员将函数(作为一个整体)描述为“非常可组合”,因为函数可以(并且在像 Haskell 这样的纯函数式语言中确实如此)包含整个程序的大小。

在软件中,我们还看到“可组合”一词更加以人为本的用法,它往往与“模块化”相关。当组件是无状态的、关注点被分离并且 API 的表面积较小时,就可以更轻松地编写程序而不会出错。我们赞扬这种设计的组件是“可组合的”——不仅仅是因为它们can被结合起来,但因为它们是easy结合正确地.

函数——编程中

我将使用稍微过时的术语“子例程”,因为我不知道用我们这个时代的用语来讨论这个问题的好方法。如果子例程不执行任何 IO(并且始终停止,并且不抛出......),那么它实现(或“是”)数学意义上的“函数”。 IO 子例程与函数表面上很相似,因为它们可能有输入和输出值,但相似之处仅此而已。我们第一次讨论的关于“函数组合”的讨论都不适用。

这就是我们遇到最棘手的语言困难的地方,因为“函数”这个词已经普遍用来指代any子例程,甚至是执行 IO 的子例程。 FP 爱好者往往会对此进行反对——人们会说“如果它支持 IO,那么它就不是一个函数”——但这场流行之战已经失败了,而且现在已经没有回头路了。在大多数编程环境中,所有子例程都称为“函数”,区分满足数学定义的函数的唯一方法是将它们称为“纯函数”。


建立这些定义后,让我们解决您的问题:

“可组合函数必须同时具有参数和返回值吗?”

关于这个问题有一些无聊的事情需要指出。首先,从技术上讲,Scala 中的每个函数都有一个返回类型。如果该类型是Unit,为了简洁起见,它可能被省略,但它仍然是一个返回类型。

空值(0-arg)函数可以简单地转换为带有参数的等效函数。所以说真的,这并不重要。如果您需要使用参数来组合函数并且f没有参数,你可以直接写_ => f.

“这个功能会不会有副作用?”

只是语义上的争论。在Scala的背景下,最恰当的说法是它是一个Function(或者从技术上讲可能是一个“方法”,具体取决于它的定义位置),但由于副作用,它不是一个纯函数。

“我们仍然认为它是‘可组合的’吗?”

有点。所有这些东西仍然以相当普遍的方式“组合在一起”,所以是的,它们确实在软件意义上组合在一起。尽管纯函数比非纯函数组合得更好。并且函数组合的数学概念不适用于非纯函数的子程序。

最后,如果你想知道它们是否真的在 Scala 中用compose方法上Function1 http://www.scala-lang.org/api/current/#scala.Function1,你不需要Stack Overflow;只需询问编译器即可。

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

什么样的函数被认为是“可组合的”? 的相关文章

随机推荐

  • 如何缩放到高图中的特定点

    Highmaps highcharts 是一个 javascript jquery 适配器 可在浏览器等中呈现地图 我有一张突出显示单个国家 地区的地图 但是 世界 地图的比例如此之大 因此我想在将地图加载到相关国家 地区后进行放大 看看
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • 如何使用回形针对多页 pdf 进行缩略图

    我想让 Paperclip 为上传的多页 PDF 文件的每一页创建 2 个缩略图 我正在运行 Paperclip 2 3 1 1 并在我的资产模型中使用它 has attached file asset styles gt medium g
  • jQuery - xpath 查找?

    如果您在 xml 中有下面的 xml 那么您会使用以下命令变得昏昏欲睡 xml find animal find dog find beagle text jQuery 中是否有类似的方法来使用 xpath xml xpathfind an
  • 无法读取解析推送通知包数据

    我尝试使用 Parse 推送通知服务发送自定义数据 但从 Bundle 中提取时总是返回 null 值 自定义广播接收器 Override public void onReceive Context context Intent inten
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 将对象映射到 TableView 部分的 Swift 二维数组

    我想不出更好的方法来做到这一点 我将学生对象的所有属性映射到二维数组中 所以我的电视有几个部分 我也不能使用静态表视图 如果是这样 这个问题就不会存在 所以我在 TVC 中的代码 let currentUser PFUser current
  • Escape String - 在 Javascript 中输出rails字符串[重复]

    这个问题在这里已经有答案了 我正在尝试将字符串值分配给 erb 文件中的 javascript 对象 如下所示 var data name 问题是 如果name is Tom s small ears 的输出data name将会Tom x
  • 如何自动更新Android Studio?

    我需要将 Android Studio 更新到 0 9 9 版本 但是当我按 下载 在更新信息对话框上 时 它会将我发送到此处 http developer android com sdk index html http developer
  • ActionBar 中的进度条

    我正在使用一个应用程序 它将在应用程序内部加载一个网站 现在我想在操作栏中添加一个进度栏 而无需向上滑动来抑制功能 像那样 我在用Fragment在我的应用程序中 WebviewFragment public class WebviewFr
  • 在 python 查询参数中使用 %20 而不是 + 作为空格

    我使用 python requests 编写了以下 python 脚本 http requests readthedocs org en latest http requests readthedocs org en latest impo
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • LSTM 批次与时间步

    我按照 TensorFlow RNN 教程创建了 LSTM 模型 然而 在这个过程中 我对 批次 和 时间步长 之间的差异 如果有的话 感到困惑 并且我希望得到帮助来澄清这个问题 教程代码 见下文 本质上是根据指定数量的步骤创建 批次 wi
  • Python列表对象属性“append”是只读的

    正如标题所说 在Python中 我试图做到这一点 以便当有人输入一个选择 在本例中为Choice13 时 它会从密码列表中删除旧密码并添加新密码 passwords mrjoebblock mrjoefblock mrjoegblock m
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj
  • Java的hashCode可以为不同的字符串产生相同的值吗?

    使用java的哈希码函数是否可以为不同的字符串提供相同的哈希码 或者如果可能的话 其可能性的 是多少 Java 哈希码是 32 位 它散列的可能字符串的数量是无限的 所以是的 会发生冲突 百分比是没有意义的 项目 字符串 的数量是无限的 而
  • 用于将 MS Word 表导出到 Excel 工作表的宏

    我有一个包含许多表格的word文档 有谁知道如何编写宏将此类表导出到不同的 Excel 工作表 答案摘自 http www mrexcel com forum showthread php t 36875 http www mrexcel
  • 如何更改焦点/按下时图像按钮的色调

    我有一个ImageButton在我的应用程序中 当按钮打开时我需要更改图像的色调pressed focused 我有ImageButton设置为获取其src来自 XML 文件 如下所示
  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数