与 Functor 不同,Monad 可以改变形状?

2024-05-28

我一直很喜欢以下关于单子相对于函子的力量的直观解释:单子可以改变形状;函子不能。

例如:length $ fmap f [1,2,3]总是等于3.

然而,对于单子来说,length $ [1,2,3] >>= g往往不等于3。例如,如果g定义为:

g :: (Num a) => a -> [a]
g x = if x==2 then [] else [x]

then [1,2,3] >>= g等于[1,3].

让我有点困扰的是类型签名g。使用通用的一元类型来定义一个改变输入形状的函数似乎是不可能的,例如:

h :: (Monad m, Num a) => a -> m a

MonadPlus 或 MonadZero 类型类具有相关的零元素,可以使用而不是[],但现在我们拥有的不仅仅是一个单子。

我对么?如果是这样,有没有办法向 Haskell 新手表达这种微妙之处。我想让我心爱的“单子可以改变形状”这句话变得更诚实一些;如果需要的话。


我一直很喜欢以下关于单子相对于函子的力量的直观解释:单子可以改变形状;函子不能。

顺便说一句,你在这里错过了一些微妙之处。为了术语的方便,我将划分Functor在 Haskell 意义上分为三个部分: 由类型参数确定并通过以下方式操作的参数组件fmap,不变的部分,例如元组构造函数State,以及“形状”和其他任何东西,例如构造函数之间的选择(例如,Nothing vs. Just)或涉及其他类型参数的部分(例如,环境Reader).

A Functor当然,单独的方法仅限于将函数映射到参数部分。

A Monad可以创造新的“形状”基于参数部分的值,它不仅仅可以改变形状。复制列表中的每个元素或删除前五个元素都会更改形状,但过滤列表需要检查元素。

这本质上是如何Applicative适合它们 - 它允许您组合两个的形状和参数值Functors独立,不让后者影响前者。

我对么?如果是这样,有没有办法向 Haskell 新手表达这种微妙之处。我想让我心爱的“单子可以改变形状”这句话变得更诚实一些;如果需要的话。

也许您在这里寻找的微妙之处在于您并没有真正“改变”任何东西。没有什么在Monad让你明确地弄乱形状。它可以让您根据每个参数值创建新形状,并将这些新形状重新组合成新的复合形状。

因此,您将始终受到创建形状的可用方法的限制。具有完全通用的Monad你所拥有的就是return,根据定义,它创建任何必要的形状,使得(>>= return)是恒等函数。的定义Monad告诉您在给定某些类型的功能的情况下您可以做什么;它不为您提供这些功能。

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

与 Functor 不同,Monad 可以改变形状? 的相关文章

随机推荐

  • Highcharts-more 的替代品

    As per npm https www npmjs com package highcharts morehighcharts more js 已弃用 我们只需要从 highcharts 文件夹中导入相应的模块即可 但是当我尝试删除 hi
  • SpatialQuery 使用 Lucene 进行基于位置的搜索

    我的 lucene 索引已索引纬度和经度字段 如下所示 doc Add new Field latitude latitude ToString Field Store YES Field Index UN TOKENIZED doc Ad
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 使用 GhostScript 获取页面大小

    是否可以使用 GhostScript 获取页面大小 例如从 PDF 文档页面 我见过 bbox 设备 但它返回的是边界框 每页不同 而不是 PDF 页面的 TrimBox 或 CropBox 看http www prePressure co
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • Android 模拟器提示和技巧 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何用日语创建 ggplot2 标题?

    我正在准备日语演示文稿 并希望图像的标题和图例名称为日语 我可以让文本在 RStudio 中渲染得很好 但是当渲染图像时 日语字符仅显示为方框 x 10 10 y x x df data frame x y ggplot df aes x
  • 禁止非 PowerShell 命令的输出?

    我正在运行命令 hg st 然后检查它是 LASTEXITCODE检查当前目录中 Mercurial 的可用性 我不关心它的输出 也不想将它展示给我的用户 如何抑制所有输出 成功或错误 由于 Mercurial 不是 PowerShell
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • android中如何将字符串转换为unicode

    我正在解析一些unicodes from json to my android应用程序 API 给出unicodes像这样的图标 ue600 当我将这个unicode直接添加到textview like textview setText u
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • 为什么使用 键取消搜索时 vim incsearch 会暂停?

    在 vim 中 如果你set incsearch然后它将滚动到当前搜索词的下一个匹配项 而无需移动光标 我经常用它来阅读一段代码而不用将光标移动到那里 因为我可以点击
  • 更改 HTA 应用程序窗口大小

    有没有办法改变 HTA 应用程序的大小 thanks
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu