函数组合与函数应用

2024-01-10

  1. 谁能给出函数组合的例子吗?
  2. 这就是函数复合运算符的定义?

    (.) :: (b -> c) -> (a -> b) -> a -> c
    f . g = \x -> f (g x)
    

这表明它需要两个函数并返回一个函数,但我记得有人用英语表达了逻辑,例如

男孩是人类 -> 阿里是男孩 -> 阿里是人类

  1. 这个逻辑与函数组合有什么关系?
  2. 函数应用和组合的强绑定是什么意思?哪个比另一个强绑定?

请帮忙。

Thanks.


(Edit 1:我第一次错过了你问题的几个组成部分;请参阅我的答案的底部。)

思考此类语句的方法是查看类型。你所拥有的论证形式称为三段论。但是,我认为你记错了一些事情。三段论有很多种,据我所知,你的三段论并不对应于函数组合。让我们考虑一种三段论:

  1. 如果外面有阳光,我会很热。
  2. 如果我热了,我就去游泳。
  3. 所以,如果天气晴朗,我就去游泳。

这被称为假设三段论 http://en.wikipedia.org/wiki/Hypothetical_syllogism。用逻辑术语来说,我们可以这样写:S代表命题“外面阳光明媚”,令H代表命题“我会变热”,并让W代表“我要去游泳”的主张。写作αβ for "α暗示β”,并将“因此”写为 ∴,我们可以将上面的内容翻译为:

  1. SH
  2. HW
  3. SW

当然,如果我们更换S, H, and W与任何任意的α, β, and γ。现在,这看起来应该很熟悉。如果我们将蕴涵箭头→改为函数箭头->,这变成了

  1. a -> b
  2. b -> c
  3. a -> c

你瞧,我们有了复合运算符类型的三个组成部分!要将其视为逻辑三段论,您可以考虑以下内容:

  1. 如果我有一个类型的值a,我可以产生一个类型的值b.
  2. 如果我有一个类型的值b,我可以产生一个类型的值c.
  3. 所以,如果我有一个类型的值a,我可以产生一个类型的值c.

这应该是有道理的:在f . g, 函数的存在性g :: a -> b告诉你前提 1 为真,并且f :: b -> c告诉你前提 2 为真。因此,您可以得出最终的语句,其中函数f . g :: a -> c是一个见证人。

我不完全确定你的三段论意味着什么。这几乎是一个例子前件 http://en.wikipedia.org/wiki/Modus_ponens,但不完全是。后件论证采用以下形式:

  1. 如果下雨的话,我就会被淋湿。
  2. 正在下雨。
  3. 所以,我会被淋湿。

Writing R对于“正在下雨”,以及W对于“我会弄湿”,这给了我们逻辑形式

  1. RW
  2. R
  3. W

用函数箭头替换蕴涵箭头,我们得到以下结果:

  1. a -> b
  2. a
  3. b

这只是函数应用,从类型中我们可以看出($) :: (a -> b) -> a -> b。如果你想将此视为逻辑论证,它可能具有以下形式

  1. 如果我有一个类型的值a,我可以产生一个类型的值b.
  2. 我有一个类型的值a.
  3. 所以,我可以产生一个类型的值b.

在这里,考虑表达式f x。功能f :: a -> b是命题 1 真实性的见证人;价值x :: a是命题 2 真实性的见证人;因此结果可以是类型b,证明结论。这正是我们从证明中发现的。

现在,您最初的三段论采用以下形式:

  1. 所有男孩都是人类。
  2. 阿里是个男孩。
  3. 所以,阿里是人。

让我们把它翻译成符号。Bx将表示x是个男孩;Hx将表示x是人类;a将表示阿里;和 ∀x. φφ对于 的所有值都成立x。然后我们有

  1. x. BxHx
  2. Ba
  3. Ha

这几乎是肯定的做法,但它需要实例化 forall。虽然逻辑上有效,但我不确定如何在类型系统级别解释它;如果有人想帮忙,我洗耳恭听。一种猜测是 2 级类型,例如(forall x. B x -> H x) -> B a -> H a,但我几乎可以肯定这是错误的。另一种猜测是更简单的类型,例如(B x -> H x) -> B Int -> H Int, where Int代表阿里,但我几乎可以肯定这是错误的。再次强调:如果你知道,也请告诉我!

最后一点。以这种方式看待事物——遵循证明和程序之间的联系——最终会带来深刻的魔力库里-霍华德同构 http://en.wikipedia.org/wiki/Curry-Howard_isomorphism,但这是一个更高级的主题。 (不过,这真的很酷!)


Edit 1:您还要求提供函数组合的示例。这是一个例子。假设我有一个人们的中间名列表。我需要构建所有中间名缩写的列表,但要做到这一点,我首先必须排除每个不存在的中间名。很容易排除所有中间名为空的人;我们刚刚include每个中间名是not空与filter (\mn -> not $ null mn) middleNames。同样,我们可以轻松地找到某人的中间名首字母head,所以我们只需要map head filteredMiddleNames为了得到列表。换句话说,我们有以下代码:

allMiddleInitials :: [Char]
allMiddleInitials = map head $ filter (\mn -> not $ null mn) middleNames

但这是非常具体的,令人恼火。我们确实想要一个中间名首字母生成函数。那么让我们把它改成一个:

getMiddleInitials :: [String] -> [Char]
getMiddleInitials middleNames = map head $ filter (\mn -> not $ null mn) middleNames

现在,让我们看一些有趣的事情。功能map有类型(a -> b) -> [a] -> [b],并且自从head有类型[a] -> a, map head有类型[[a]] -> [a]。相似地,filter有类型(a -> Bool) -> [a] -> [a], 所以filter (\mn -> not $ null mn)有类型[a] -> [a]。因此,我们可以去掉这个参数,改写

-- The type is also more general
getFirstElements :: [[a]] -> [a]
getFirstElements = map head . filter (not . null)

你会看到我们有一个额外的组合实例:not有类型Bool -> Bool, and null有类型[a] -> Bool, so not . null有类型[a] -> Bool:它首先检查给定列表是否为空,然后返回是否为空isn't。顺便说一下,这个转换将函数变成了无点风格 http://www.haskell.org/haskellwiki/Pointfree;也就是说,结果函数没有显式变量。

您还询问了“强绑定”。我认为你指的是优先级. and $运算符(也可能是函数应用程序)。在 Haskell 中,就像在算术中一样,某些运算符比其他运算符具有更高的优先级,因此绑定更紧密。例如,在表达式中1 + 2 * 3,这被解析为1 + (2 * 3)。这是因为在 Haskell 中,以下声明有效:

infixl 6 +
infixl 7 *

数字越高(优先级),调用该运算符越早,因此该运算符绑定得越紧密。函数应用实际上具有无限优先级,因此它绑定最紧密:表达式f x % g y将解析为(f x) % (g y)对于任何操作员%. The .(组成)和$(应用程序)运营商具有以下固定性声明:

infixr 9 .
infixr 0 $

优先级范围从零到九,所以这说明的是.操作符绑定more比任何其他应用程序都紧密(函数应用程序除外),并且$ binds less紧紧。因此,表达式f . g $ h将解析为(f . g) $ h;事实上,对于大多数运营商来说,f . g % h(f . g) % h and f % g $ hf % (g $ h)。 (唯一的例外是极少数其他零或九个优先级运算符。)

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

函数组合与函数应用 的相关文章

  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 如何使用 jQuery 在第二次单击时反转 CSS 动画

    我制作了以下菜单图标 CSS 动画 当我点击它时会触发它 当我使用 jQuery 第二次单击它时 我想使其反向动画 path1 stroke dasharray 33px stroke dashoffset 33px animation l
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 带有 UnboundLocalError 的本地和全局引用

    我不太明白为什么代码 def f print s s foo f 运行得很好但是 def f print s s bar s foo f 给我 UnboundLocalError 我知道我可以通过声明来解决这个问题s作为函数内的全局变量或简
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 根据传递的参数覆盖 Javascript 函数

    是否可以根据传递给函数的参数数量来重写函数 例如 function abc name document write My name is name function abc name friend document write My nam
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • 根据 R 数据框中的名称对列进行平均

    我想知道是否有一种有效的方法来获取每组的平均值类似命名的列谁的名字结尾为 1S and 2S ex ex1S ex2S at time 1并取每组的平均值类似命名的列谁的名字结尾为 1C or 2C ex ex1C ex2C at time
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • Haskell Stack 从 github 安装包依赖项

    是否可以使用 Haskell 堆栈从 github 安装软件包的版本 例如在一个 cabal or a stack yaml文件 如何在 git repo branch revision 上指向依赖项 对于堆栈 The 的文档stack y
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • 找不到模块“Yesod”

    我有以下代码 LANGUAGE TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings module Simple where imp
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • 使用 MID、LEN 和 FIND 函数提取单元格文本的某些部分?

    我有一份 Excel 作业 但我陷入了最后部分 我被要求使用 MID LEN 和 FIND 来提取单元格内的特定字符串 我非常了解每个人的工作方式 将这三者结合起来并让它们发挥作用是我遇到的问题 我需要将城市与地址的其余部分分开 然后将其显

随机推荐

  • Mule ESB 中的重连策略

    我正在尝试验证文档中提到的 Mule ESB 中的重新连接策略 我已将标准重新连接策略设置为重试次数为 5 次并设置一些超时 我的终点无法到达 因为故意停止它来测试场景 我在 Mule 控制台中有一个例外 异常堆栈是 1 连接被拒绝 con
  • 为什么我们会在每台计算机安装中收到非广告快捷方式的 ICE57 错误?

    此问题询问 ICE57 验证器之一是否会创建误报错误报告 我正在使用 WIX 3 9 生成安装程序 我想要使 用非广告快捷方式的每台计算机安装 此 WXS 示例安装一个文本文件和打开该文本文件的快捷方式
  • MongoDB $set 不更新记录

    我正在使用 PHP PECL 扩展尝试 MongoDB 但是我很难让某个更新查询正常工作 我在 SO 上四处寻找答案 但运气不佳 我创建了一个基本集合 m new Mongo collection m gt testdb gt testco
  • 如何在通知视图中制作倒计时器?

    我想出了如何使用来制作自定义视图RemoteViews http developer android com reference android widget RemoteViews html班级 我也知道怎么用Chronometer ht
  • 一个大的 javascript 文件还是多个较小的文件? [复制]

    这个问题在这里已经有答案了 好的 我有一个大小合理的项目 其中使用 jquery 主干和其他几个 javascript 库 我想知道是否应该为我的 javascript 库准备一个文件 为我的自定义代码准备另一个文件 或者一堆单独的 jav
  • HTTP/1.0 还在使用吗?

    比如说写一个HTTP服务器 客户端 支持HTTP 1 0有多重要 如今它还在任何地方使用吗 Edit 我不太关心 HTTP 1 0 的有用性 重要性 而是关心它的数量software实际上将其用于现实世界中的非内部 例如 单元测试是内部使用
  • 如何在Python中的段落中加入换行符

    我有一些采用以下格式的文本 r n 1 r n par1 par1 par1 r n r n par1 par1 par1 r n r n 2 r n r n par2 par2 par2 我想做的是将它们连接成段落 以便最终结果是 1 p
  • 如何在 React 组件中使用 @types/redux-form 定义的类型与 Field 和 FieldArray?

    我正在使用 React Redux Redux Form 和 TypeScript 开发应用程序 我正在努力使用包 types redux form 定义的类型 绝对打字 https github com DefinitelyTyped D
  • MailChimp 内容阻止拖放不起作用

    我必须在 MailChimp 服务中编辑现有的自定义模板 其中内容块的拖放功能不起作用 模板有很多嵌套表 因此我联系了他们的支持人员 他们的回复是某些块是嵌套的 可能会导致冲突 为了制作简单的测试用例场景 我删除了大部分代码 样式 只留下一
  • Onclick普通按钮正在提交表单

    SCENARIO 我有一个java带有长表单的 JSP 视图 这工作得很好 我可以通过在任何输入字段中按 Enter 键或使用提交按钮来提交表单 新要求 在一部分中 我必须添加按钮来替换一些
  • WPF System.ComponentModel.Win32Exception(0x80004005):无效的窗口句柄

    我在 WPF 上收到以下错误 我正在使用 MVVM 数据绑定到窗口上的 DataContext CollectionViewSources 视图模型和视图中有太多代码需要发布 但我想知道在哪里可以找到它 因为没有出现行号 该窗口使用 WPF
  • 拒绝浏览器通知权限

    根据规格 https developer mozilla org en US docs Web API Notification requestPermission 您可以提示浏览器允许用户授予或拒绝浏览器通知 一旦用户授予权限 是否也可以
  • 防止负载均衡器在长时间运行期间超时

    我使用 ASP NET MVC 4 接受最大 30 mb 的视频上传 视频上传到网站后 视频就会使用 HttpWebRequest 发布到第三方 Web 服务 向第三方服务的上传必须完成并返回响应 然后我的网站才能向浏览器返回响应 在 Ra
  • 编写我自己的 init 可执行文件

    我想创建自己的 init 并为下雪的周末带来一些 Linux 乐趣 我知道 内核使用 rootfs 启动 并在加载驱动程序和安装磁盘后将流程提供给 sbin init 我下载了ubuntu云镜像并尝试使用kvm直接启动内核 如下所示 kvm
  • Python Pandas:将具有唯一值的行连接起来

    在 Python pandas 中 我有一个大数据框 如下所示 df pd DataFrame a foo bar 3 b foo2 bar2 3 c foo3 bar3 3 d q w e r t y e q2 w2 e2 r2 t2 y
  • NHibernate 2.1 和 Oracle 10g 客户端出现错误

    我需要 NHibernate 2 1 才能与 Oracle 数据库对话 我被要求使用 Oracle 10g 客户端 尝试构建会话工厂时出现以下错误 无法转换类型的对象 Oracle DataAccess Client OracleConne
  • 如何将事件侦听器添加到对象数组

    我有一个对象数组 具体来说easelJS图片 像这样 var imageArray new Array gShape new createjs Shape shape is something imageArray push gShape
  • Cassandra 牺牲了 CAP 定理的哪一部分?为什么?

    有一个很棒的演讲 https github com strangeloop StrangeLoop2013 blob master slides sessions Kingsbury PartitionsForEveryone pdf关于在
  • 使用窗口事件调整画布元素大小

    我正在使用打字稿来绘制画布元素 我想让我的画布元素响应屏幕尺寸 这样我就可以将画布大小与父 div 元素相匹配 我试过用这个删除画布中的大小并在 css 中提供它 但这没有帮助 因为我有两个固定元素 我找到了这个已有 8 年历史的解决方案画
  • 函数组合与函数应用

    谁能给出函数组合的例子吗 这就是函数复合运算符的定义 b gt c gt a gt b gt a gt c f g x gt f g x 这表明它需要两个函数并返回一个函数 但我记得有人用英语表达了逻辑 例如 男孩是人类 gt 阿里是男孩