我不清楚应用函子评估

2024-02-02

我目前正在阅读 Learn a Haskell for Great Good!并且我偶然发现了对某个代码块的评估的解释。我已经阅读了几次解释,并且开始怀疑作者是否理解这段代码的作用。

ghci> (+) <$> (+3) <*> (*100) $ 5
508

应用函子将某些上下文中的函数应用于某些上下文中的值,以在某些上下文中获得某些结果。我花了几个小时研究这个代码块,并就如何计算这个表达式提出了一些解释,但没有一个是令人满意的。我知道 (5+3)+(5*100) 是 508,但问题是如何得到这个表达式。有谁对这段代码有明确的解释吗?


另外两个答案给出了如何计算的细节 - 但我想我可能会用一个更“直观”的答案来解释如何在不经过详细计算的情况下,人们可以“看到”结果必须是 508 。

正如你所暗示的,每一个Applicative(事实上​​,即使每个Functor)可以被视为一种特定类型的“上下文”,它保存给定类型的值。举个简单的例子:

  • Maybe a是一个上下文,其中类型的值a可能存在,但也可能不存在(通常是由于某种原因可能失败的计算结果)
  • [a]是一个可以保存零个或多个类型值的上下文a,数量没有上限 - 表示特定计算的所有可能结果
  • IO a是一个上下文,其中类型的值a是通过某种方式与“外部世界”互动的结果。 (好吧,这不是那么简单......)

并且,与此示例相关:

  • r -> a是一个上下文,其中类型的值a可用,但其特定值尚不清楚,因为它取决于类型的某些(尚未知)值r.

The Applicative基于这种背景下的价值观,可以很好地理解方法。pure将“普通值”嵌入“默认上下文”中,其中它在该上下文中的行为尽可能接近“与上下文无关”的值。我不会对上面 4 个示例中的每一个进行详细介绍(其中大多数都非常明显),但我会注意到对于函数,pure = const- 即“纯值”a由总是产生的函数表示a无论源值是什么。

而不是纠结于如何<*>虽然可以使用“上下文”隐喻来最好地描述,但我想详细讨论特定的表达方式:

f <$> a <*> b

where f是 2 个“纯值”之间的函数a and b是“上下文中的值”。这个表达式实际上有一个函数的同义词:liftA2 http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Applicative.html#v:liftA2。虽然使用liftA2函数通常被认为不如“应用风格”惯用,使用<$> and <*>,这个名字强调了这个想法是将“普通价值观”的功能“提升”为“上下文中的价值观”的功能。当这样思考时,我认为在给定特定的“上下文”(即特定的“上下文”)的情况下,它的作用通常是非常直观的Applicative实例)。

所以表达式:

(+) <$> a <*> b

对于价值观a and b类型说f Int对于一个应用程序f,对于不同的实例表现如下f:

  • if f = Maybe,那么结果,如果a and b都是Just值,是将基础值相加并将它们包装在Just。如果其中之一a or b is Nothing,那么整个表达式就是Nothing.
  • if f = [](列表实例)然后上面的表达式是包含表单的所有总和的列表a' + b' where a' is in a and b' is in b.
  • if f = IO,那么上面的表达式就是一个IO动作,执行了所有的I/O效果a其次是那些b,并得出总和Ints 由这两个动作产生。

那么,最后,如果f是函数实例吗?自从a and b都是描述如何获得给定值的函数Int给定任意 (Int)输入,很自然地提升(+)对它们的函数应该是在给定输入的情况下获得两个结果的函数a and b函数,然后将结果相加。

当然,这就是它所做的事情 - 其他答案已经非常巧妙地描绘了它所做的明确路线。但它之所以会这样——事实上,这就是我们有这样的例子的原因f <*> g = \x -> f x (g x),这可能看起来相当任意(尽管实际上它是极少数的事情之一,如果不是唯一的,将进行类型检查),以便实例匹配“依赖于某些as-的值”的语义根据给定的函数,还有未知的其他值”。总的来说,我想说,像这样“在高层次上”思考通常比被迫深入了解计算如何执行的低层次细节要好。 (尽管我当然不想淡化能够做到后者的重要性。)

[实际上,从哲学的角度来看,更准确的说法是定义就是这样,因为它是类型检查的“自然”定义,并且实例随后采用这样的方式只是令人高兴的巧合一个美好的“意义”。数学当然充满了这样令人高兴的“巧合”,结果证明它们背后有非常深刻的原因。]

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

我不清楚应用函子评估 的相关文章

  • 如何在 Perl 中以函数式风格进行编码?

    你如何 have a sub返回一个sub or 将文本作为代码执行 in Perl 另外 如何拥有匿名函数存储状态 子返回子作为coderef example 1 return a sub that is defined inline s
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • “函数是第一等值”这到底是什么意思?

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

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性

随机推荐

  • 如何在所有幻灯片上添加固定页脚?

    我设置了一个演示文稿reveal js这意味着在无人值守的情况下使用 因此 我希望能够在所有幻灯片上显示一个小页脚 或其他链接 指向 信息幻灯片 其中包含有关作者 如何使用幻灯片等的数据 这是为了帮助那些不太了解如何使用 Reveal js
  • 如何使 React Native Animated.View 可点击?

    我正在使用这个 React Native Tinder 演示 gt https github com brentvatne react native animated demo tinder https github com brentva
  • 组合框 JavaFx 与 FXML

    我该如何使用组合框 with FXML 我需要设置动态数据 有人有例子吗 这是我的 Sample fxml
  • 在没有cloudera manager的情况下安装cloudera impala

    请提供在没有cloudera manager的情况下在ubuntu中安装imapala的链接 无法使用官方链接安装 无法使用这些查询找到 impala 包 sudo apt get install impala Binaries for d
  • 通过 Kubernetes 在 Docker 容器中挂载 Azure 文件存储

    我正在尝试使用此处找到的方法将我的 Azure 文件存储安装到容器中 https github com kubernetes kubernetes tree master examples volumes azure file https
  • 如何改进在 Android 上使用 ORMLite 加载对象的方法?

    我正在 Android 上使用 ormlite 4 35 加载一组对象 及其外来对象 在模拟器中 计时需要 16 到 19 秒getAllCragsWithLocation 方法如下 数据库中有 590 个峭壁 其中 40 个没有位置 记录
  • 无法以编程方式更改WordPress用户头像

    我正在尝试更改我的 WordPress 网站的几个用户的头像 我读过 最好的方法是使用 WP User Avatar 插件和下面的代码 但不幸的是它不起作用 我可以询问社区的建议吗 function set avatar url avata
  • 如何命名 iPad 3 的图形文件

    据我了解 在 iOS 中 我们可以将用于视网膜显示的文件命名为 电子邮件受保护 cdn cgi l email protection 如何为 iPad 3 命名文件 ipad png iPad iPad 2 电子邮件受保护 cdn cgi
  • 为什么 c# JavaScriptSerializer.Serialize 返回空方括号

    为什么下面的代码应该返回 id 1999 title hithere 却返回 JavaScriptSerializer serializer new JavaScriptSerializer StringBuilder sbJsonResu
  • Spring Data JPA findBy 集合[重复]

    这个问题在这里已经有答案了 我正在使用 JPA 使用 Java 开发路线规划系统 我需要创建一个 findBy 方法来通过其包含的城市列表查找路线 以下是课程 Entity public class Route ManyToMany cas
  • 自定义从 UITextView 打开的自动 MFMailComposeViewController

    我有一个简单的UITextView其中有一个电子邮件链接 文本视图是可选择的并检测链接 这样 您可以单击电子邮件 它会以模式方式打开MFMailComposeViewController视图控制器 但是 我在应用程序启动时做了一些自定义 U
  • 当应用程序在 Android 10 中被杀死时,WorkManager 无法工作,尽管在版本 9 之前工作正常(Pie)

    当应用程序被 Android 10 中的后台任务杀死时 我没有通过 Workmanager 收到通知 我发现了这个问题 它适用于所有 Android 版本 直到 Andorid 9 为了测试这一点 我在 9 和 10 版本上同时运行该应用程
  • 使用 DTE.ExecuteCommand 响应对话框

    有没有办法说Yes or No or OK使用以下命令打开 Visual Studio 2015 时出现对话框 消息框EnvDTE 我尝试在盒子打开时调试我的应用程序 但我不知道要寻找什么 我也尝试过在内部搜索这个命令列表 https gi
  • 关闭Excel应用程序的正确方法

    我正在编写一个应用程序 它使用以下代码访问 Excel 文件 RBTApplication new Excel Application RBTWorkbooks RBTApplication Workbooks RBTWorkbook RB
  • C++中如何判断一个指针指向什么类型的对象?

    假设我有class SuperClass public int a and class SubClass SuperClass public int b 我获取了一个指向子类实例的指针SubClass subPointer并将该指针寻址到超
  • 如何检查客户端网络/防火墙上的端口是否打开?

    最后通过 jQuery AJAX 和 JSONP 的 超时 属性解决了这个问题 看我自己的回答 请参阅更新的部分 我也尝试过使用小程序 如果您能提供小程序实现的解决方案 我们将毫不犹豫地接受您的答案 我正在使用基于 Java 的 Web 应
  • 如何在 React Native 中添加按钮网格样式?

    我最近将手放在了 React Native 上 并尝试将按钮动态添加到视图中 我想要一个像这样的结构 在引导程序中我会添加一个带有 col md 4 的类 A A A A A A A A A A A A 我已经可以添加按钮 但它们总是出现在
  • .NET / C# 的线性编程库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要求解欠定线性方程组和约束 然后找到最小化成本函数的特定解决方案 这需要通过在 NET 和 Mon
  • 如何在谷歌地图目标c上旋转自定义标记图像

    目前我正在开发一个像 Uber iOS 应用程序这样的应用程序 我已经集成了 Google Maps SDK 并且还显示了用户当前位置的自定义图像 目前我正在从服务器获取一些驾驶员当前位置详细信息 例如 100 个驾驶员 我保存在一个NSA
  • 我不清楚应用函子评估

    我目前正在阅读 Learn a Haskell for Great Good 并且我偶然发现了对某个代码块的评估的解释 我已经阅读了几次解释 并且开始怀疑作者是否理解这段代码的作用 ghci gt lt gt 3 lt gt 100 5 5