类型类 MonadPlus、Alternative 和 Monoid 之间的区别?

2023-12-01

标准库 Haskell 类型类MonadPlus, Alternative, and Monoid每个方法都提供了两种语义基本相同的方法:

  • 空值:mzero, empty, or mempty.
  • 操作员a -> a -> a将类型类中的值连接在一起:mplus, <|>, or mappend.

所有这三个都指定了实例应遵守的这些法律:

mempty `mappend` x = x
x `mappend` mempty = x

因此,这三个类型类似乎都提供了same方法。

(Alternative还提供some and many,但它们的默认定义通常就足够了,因此对于这个问题来说它们并不是太重要。)

所以,我的问题是:为什么有这三个极其相似的类?除了不同的超类限制之外,它们之间还有什么真正的区别吗?


MonadPlus and Monoid服务于不同的目的。

A Monoid通过 kind 的类型进行参数化*.

class Monoid m where
    mempty :: m
    mappend :: m -> m -> m

因此它可以被实例化为几乎任何类型,只要有一个明显的结合运算符并且有一个单位。

然而,MonadPlus不仅指定您具有幺半群结构,而且还指定该结构与Monad works, and该结构不关心 monad 中包含的值,这一点(部分)由以下事实表明:MonadPlus进行某种争论* -> *.

class Monad m => MonadPlus m where
    mzero :: m a
    mplus :: m a -> m a -> m a

除了幺半群定律之外,我们还有两套潜在的定律可以应用到MonadPlus。可悲的是,社区对于它们应该是什么样子存在不同意见。

至少我们知道

mzero >>= k = mzero

但还有另外两个相互竞争的扩展,左(原文如此)分布定律

mplus a b >>= k = mplus (a >>= k) (b >>= k)

和左捕获法则

mplus (return a) b = return a

所以任何实例MonadPlus应满足这些附加法律中的一项或两项。

那么呢Alternative?

Applicative是在之后定义的Monad,并且逻辑上属于Monad,但很大程度上是由于 Haskell 98 中设计师面临的不同压力,甚至Functor不是一个超类Monad直到2015年。现在我们终于有了Applicative作为一个超类Monad在 GHC 中(如果尚未在语言标准中。)

有效地,Alternative is to Applicative what MonadPlus is to Monad.

对于这些我们会得到

empty <*> m = empty

类似于我们所拥有的MonadPlus并且存在类似的分配和捕获属性,您至少应该满足其中之一。

不幸的是,即使empty <*> m = empty法律的主张过于强烈。它不适用向后, 例如!

当我们观察 MonadPlus 时,空 >>= f = 空法则几乎是强加给我们的。空结构中不能有任何“a”来调用该函数f无论如何。

然而,自从Applicative is not的超类Monad and Alternative is not的超类MonadPlus,我们最终分别定义两个实例。

而且,即使Applicative是一个超类Monad,你最终会需要MonadPlus无论如何都要上课,因为即使我们确实遵守了

empty <*> m = empty

这还不足以证明这一点

empty >>= f = empty

所以声称某物是MonadPlus比声称的更强大Alternative.

现在,按照惯例,MonadPlus and Alternative对于给定类型应该一致,但是Monoid may be 完全地不同的。

例如MonadPlus and Alternative for Maybe做显而易见的事情:

instance MonadPlus Maybe where
    mzero = Nothing
    mplus (Just a) _  = Just a
    mplus _        mb = mb

but the Monoid实例将半群提升为Monoid。可悲的是,因为不存在Semigroup当时在 Haskell 98 中,它通过要求Monoid,但不使用其单位。 ಠ_ಠ

instance Monoid a => Monoid (Maybe a) where
    mempty = Nothing
    mappend (Just a) (Just b) = Just (mappend a b)
    mappend Nothing x = x
    mappend x Nothing = x
    mappend Nothing Nothing = Nothing

TL;DR MonadPlus是一个比Alternative,这又是一个比Monoid,而同时MonadPlus and Alternative类型的实例应该是相关的,Monoid可能(有时是)完全不同的东西。

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

类型类 MonadPlus、Alternative 和 Monoid 之间的区别? 的相关文章

  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or
  • 如何根据列表中的先前值过滤Haskell中的列表元素?

    我正在努力在 Haskell 中创建一个函数 该函数根据列表中前一个元素的条件过滤列表的数字 Example 前一个数字是 2 的倍数 myFunction 1 2 5 6 3 expected output 5 3 我知道如何申请filt
  • 使用 Template Haskell 生成函数

    是否可以使用 Template Haskell 定义函数 例如 convertStringToValue String gt Int convertStringToValue three 3 convertStringToValue fou
  • Haskell Servant 和流媒体

    我正在尝试添加一个功能到我的servant服务器将从 Amazon S3 获取文件并将其流式传输回用户 由于文件可能很大 我不想将它们下载到本地然后将它们提供给客户端 我宁愿将它们直接从 S3 流式传输到客户端 I use Amazonka
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 在 Haskell 中阅读 GraphML

    我正在尝试将包含单个有向图的 GraphML 文件读入 HaskellData Graph http hackage haskell org package containers 0 2 0 1 docs Data Graph html为了
  • 是否可以列出派生 Generic 的记录数据类型中字段的名称和类型?

    我知道对于派生 Data Data 的数据类型 constrFields http hackage haskell org package base 4 7 0 2 docs Data Data html v constrFields给出字
  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes

随机推荐

  • 使用 Cypress 登录 WordPress,无需使用 UI

    In the 有关登录的 Cypress 文档他们指出不应使用 UI 设置状态 但看起来 WordPress 的 API 中没有提供登录功能 由于黑客攻击是大多数 WordPress 站点上的一个问题 所以我不想添加它 如何使用 Cypre
  • 如何在 django 通道上使用令牌身份验证对 Websocket 进行身份验证?

    我们想为我们的 websocket 使用 django channels 但我们也需要进行身份验证 我们有一个与 django rest framework 一起运行的 Rest api 我们使用令牌来验证用户身份 但 django cha
  • NSXMLParser 因 & 符号而阻塞

    我正在使用 NSXMLParser 解析一些 HTML 只要遇到 符号 它就会遇到解析器错误 我可以在解析它之前过滤掉 符号 但我宁愿解析那里的所有内容 它给我错误 68 NSXMLParserNAMERequiredError 名称是必需
  • 在一行与 1 和 0 矩阵之间进行异或的更快方法?

    我有一行数据 比如说A 0 1 1 1 0 0 矩阵 B 包含许多行 对于一个虚拟的例子 我们假设它只是B 1 1 1 0 1 0 1 0 0 1 0 1 我想找到 A 和 B 的行不同的列数 并使用该差异向量来查找 B 的哪一行与 A 最
  • 使用字符串创建 Red 语言的单词和路径

    我有字符串在namelist 对应于应用程序中的变量和字段名称 该函数应该从名称列表中读取字符串 添加 f 以获取 field names 然后将变量值放入相应的字段中 我尝试了以下代码 没有给出任何错误 但也不起作用 namelist v
  • Rstudio不会编织

    Rstudio 不会编织 我已经在课程中使用它几个星期了 当我尝试编织时 它会执行直到遇到一些代码并停止 代码是 ggplot 数据 gss aes x 年 填充 度 几何酒吧 消息是 找不到函数 ggplot 其他函数也会发生这种情况 注
  • C#8 接口及其中定义的属性/方法 - 显然不起作用

    这是我使用的界面 public interface IPresentism public abstract bool isPresent get public virtual bool isAbsent gt isPresent isPre
  • Oracle 中的 OVER 子句

    Oracle中的OVER子句是什么意思 The OVER子句指定分析函数运行的 分区 排序和窗口 示例 1 计算移动平均线 AVG amt OVER ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1
  • 如何通过解析 TTF 字体文件获取字形宽度?

    用于捕获 a 的字形宽度TrueType字体 我转换对应的TTF归档依据fontforge into AFM 它是文本格式 不是二进制 然后 解析文本文件以捕获字形宽度 应该有更简单的方法来直接解析二进制文件TTF文件来捕获字形宽度 我很欣
  • C# 索引属性?

    我使用 Visual Basic 已经有一段时间了 最 近决定开始学习 C 作为学习更复杂语言的一个步骤 作为这次跳跃的一部分 我决定将一些旧的 VB 项目手动转换为 C 我遇到的问题是转换一个具有使用带有参数 索引的属性的类的库 在 VB
  • 如何调试IE11 APPCACHE

    我有一个适用于 CHROME 和 SAFARI 的 HTML5 页面 但使用 Internet Explorer 11 不起作用 我的缓存清单根据http manifest validator com 我很沮丧 这是 AppCache 清单
  • 将 XHTML 转换为 Word ML

    将 Word HTML 转换为 Word XML 的最佳方法是什么 我无法购买工具 因此需要最好是 XSLT 它是免费的 并且适用于段落 列表 粗体和斜体等基本格式 斯蒂芬 布永写了一篇blog关于这一点 请参阅 MSDN 她提供了一个非常
  • Firebase Cloud 代码(后端逻辑)

    我正在考虑使用 Firebase 而不是 Parse 因为它即将关闭 来满足我未来的移动后端需求 我真的很喜欢它的实时数据库方面 但它没有像 Parse 与 Cloud Code 那样轻松集成后端逻辑 有没有简单的方法可以实现此功能 或者很
  • 无效的正则表达式错误

    我正在尝试检索该字符串的类别部分 property id 516 category featured properties 所以结果应该是 featured properties 我想出了一个正则表达式并在这个网站上进行了测试http gs
  • 将 Ado.net DataReader 转换为 IDataRecord 给出奇怪的结果

    我有一个针对数据库运行的查询 我可以看到有一条 2013 年 5 月 31 日的记录 当我使用 ADO NET 从 C 运行此查询 然后使用以下代码时 我丢失了 2013 年 5 月 31 日的记录 var timeSeriesList n
  • fileReader.readAsBinaryString 上传文件

    尝试使用 fileReader readAsBinaryString 通过 AJAX 将 PNG 文件上传到服务器 精简代码 fileObject 是包含我的文件信息的对象 var fileReader new FileReader fil
  • Google Sheets:具有动态变化的自定义函数

    我正在使用一个自定义功能跟踪什么为单元格着色是 但是这个函数有一个问题不更新自身如果细胞颜色改变 细胞颜色 function GetCellColorCode input var ss SpreadsheetApp getActiveSpr
  • 气流 Schedule_interval 和 start_date 使其始终触发下一个间隔

    如何配置气流 mwaa 以便它在部署 dag 时每天同一时间 太平洋标准时间上午 6 点 触发 我尝试过对我来说有意义的事情 将schedule interval设置为0 6 将开始日期设置为 now datetime utcnow now
  • javascript 中 isNaN 和 Number.isNaN 之间的混淆

    我对 NaN 的工作原理感到困惑 我已经执行了isNaN undefined 它回来了true 但如果我会使用Number isNaN undefined 它正在返回false 那么我应该使用哪一个 还有为什么结果有这么大的差异 引用一个p
  • 类型类 MonadPlus、Alternative 和 Monoid 之间的区别?

    标准库 Haskell 类型类MonadPlus Alternative and Monoid每个方法都提供了两种语义基本相同的方法 空值 mzero empty or mempty 操作员a gt a gt a将类型类中的值连接在一起 m