Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Monoid vs MonadPlus

Monoid vs MonadPlus
EN

Stack Overflow用户
提问于 2013-06-12 02:40:07
回答 3查看 5.1K关注 0票数 24

我对MonadsMonoids都是新手,最近也了解了MonadPlus。在我看来,MonoidMonadPlus都提供了具有关联二元操作和标识的类型。(用数学术语来说,我称之为半群。)那么MonoidMonadPlus之间的区别是什么呢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-12 08:58:14

semigroup是配备有关联二元运算的结构。monoid是具有用于二元运算的单位元素的半群。

单子和半群

每个monad都必须遵守the monad laws。对于我们的例子,重要的是结合性定律。使用>>=表示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(m >>= f) >>= g     ≡   m >>= (\x -> f x >>= g)

现在,让我们应用这个定律来推导>> :: m a -> m b -> m b的结合性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(m >> n) >> p        (m >>= \_ -> n) >>= \_ -> p
                    ≡ m >>= (\x -> (\_ -> n) x >>= \_ -> p)
                    ≡ m >>= (\x -> n >>= \_ -> p)
                    ≡ m >>= (\x -> n >> p)
                    ≡ m >> (n >> p)

(我们选择了x,这样它就不会出现在mnp中)。

如果我们对类型代码进行专门化(用b代替a),我们可以看到在<>e226m a -> m a -> m a > m a**.**上,任何类型的a形成了一个半群。由于对任何<代码>D30都是如此,我们得到了一个由<代码>D31索引的半群类。然而,它们通常不是么半群-我们没有>>的身份元素。

MonadPlus和么半群

MonadPlus又添加了两个操作:mplusmzeroMonadPlus laws明确声明,对于任意amplusmzero必须在m a上形成一个么半群。再一次,我们得到一类由a索引的么半群。

请注意MonadPlusMonoid之间的区别:Monoid说,对于所有可能的a类型,m a类型都满足偏置规则。这是一个更强的条件。

因此,一个MonadPlus实例形成了两种不同的代数结构:一类是具有>>的半群,另一类是具有mplusmzero的么半群。(这并不少见,例如,大于零的自然数集与+形成半群,与×1形成么半群。)

票数 34
EN

Stack Overflow用户

发布于 2013-06-12 02:52:40

如果我们有MonadPlus m成立,那么你会说m是一个函数,但是m a (将a应用于类型“Monadm得到的类型)是么半群。

如果我们定义(类似于Data.Monoid的定义,但我们将在后面使用它)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class                Semigroup a where  (<>) :: a -> a -> a
class Semigroup a => Monoid    a where  zero :: a

然后它就有了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mzero :: MonadPlus m => m a
mplus :: MonadPlus m => m a -> m a -> m a

具有相当可比的类型和适当的法则

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- left and right identity
mplus a     mzero   ==   a
mplus mzero a       ==   a

-- associativity
(a `mplus` b) `mplus` c   ==   a `mplus` (b `mplus` c)

如果我们使用-XFlexibleInstances,我们甚至可以定义一个Haskell Monoid

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{-# LANGUAGE FlexibleInstances #-}
instance MonadPlus m => Semigroup (m a) where  (<>) = mplus
instance MonadPlus m => Monoid    (m a) where  zero = mzero

尽管它们与Data.Monoid中的实例严重重叠,这可能是它不是标准实例的原因。

像这样的么半群的另一个例子是Control.ApplicativeAlternative m => m a

票数 12
EN

Stack Overflow用户

发布于 2014-11-14 10:24:40

我必须强调一个非常重要的区别:不像Monoid,也不像其他答案所说的那样,MonadPlus 提供了一个具有关联的二元操作和标识的类型。哈斯克尔报告是唯一可以声明标准状态的文件,它没有指定MonadPlus的定律,因此不要求mplus是结合性的,或者mzero是它的左或右单位。也许作者仍然在争论这些定律: mplus有很好的理由不能联想。例如,如果mplus是结合型但非交换型的,则MonadPlus表示的非确定性搜索计算无法完成(也就是说,存在我们找不到的解)。由于mplus很少是可交换的,如果我们坚持结合性,任何完整的非确定性搜索过程都不能用MonadPlus表示。关于SC:Must mplus always be associative上的MonadPlus法律问题已经有了详细的讨论

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17056881

复制
相关文章
js 数组转json,json转数组[js 数组与json 互相转换]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151825.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/24
12K0
php 数组转json对象 和json 数组
php中数组转json的规则是:当没有指定索引(0~n)时会转换为json数组,而指定了索引会转换为json对象。
全栈程序员站长
2022/06/24
6.4K0
js 数组转json和json转数组
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151869.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/24
8K0
js中onclick传json数据
js中onclick传json数据 现在要在onclick事件中传递对象参数,由于我们是通过字符串拼接传的,那我们传之前用JSON.stringify(value)先将JSON对象转为JSON字符串,传之后再用eval(value)将JSON字符串转为JSON对象。(当然了,方法很多,这只是其中一种)
别团等shy哥发育
2023/02/25
10.3K0
js中onclick传json数据
ajax前端传多维数组到php后台,关联数组转json到后台方法
这是一个技术性的问题,百度说的JSON.stringify(arr)是不能转换关联数组的,甚至索引数组也是有很多缺点
仙士可
2019/12/19
3.1K0
ajax前端传多维数组到php后台,关联数组转json到后台方法
js json字符串转json数组_string转json数组
查了很久,也实践了很多,都没有成功。网上说得最多的就是用 net.sf.json.JSONArray和net.sf.json.JSONObject 两个jar 包里面的
全栈程序员站长
2022/11/08
13.3K0
Js 数组转JSON格式
要点2:在js里写数组的时候是var data = new Array() 但是你如果是要转json显示的时候就要写成 var data = {},不然转出来的json全是空的。
全栈程序员站长
2022/06/24
12K0
Js 数组转JSON格式
js数组添加json数据[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133387.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/14
11.7K0
PHP 数组转 JSON支持中文
value: 要编码的值。该函数只对 UTF-8 编码的数据有效。 options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
九霄道长
2021/03/02
3K0
PHP数组转json「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151842.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/24
1.5K0
json数组对象转化为json字符串_js如何转数组
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
5.1K0
js数组、json、js对象的区别与联系
最近在敲代码时,遇上了一个关于JS数组的问题,由此引发了关于对象和json的联想,曾经觉得很畅顺的知识点突然模糊了。于是,为了理清这些东西,有了如下这篇文章。觉得没问题的猿们可以当复习,而那些带着疑问的童鞋可以细细看。当然,有任何问题欢迎指出。理清这些问题,第一步当然是找到他们的概念:js所有事物都是对象:字符串、数值、数组、函数…此外,JavaScript允许自定义对象 (1)JS数组,常态为var a = [1,2,3]的格式,用文字来形容就是一个有序数列。因为是有序的,所以里面的东西是按序排放。 (
IT架构圈
2018/05/31
9.4K0
js 二维数组 添加json数据及js数组与json字符串「建议收藏」
JSON(JavaScript Object Notation )是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,JSON是JavaScript原生数据格式。
全栈程序员站长
2022/09/01
4.4K0
js 二维数组转Json数组「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151829.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/24
2.5K0
如何将多个参数传递给 React 中的 onChange?
在 React 中,一些 HTML 元素,比如 input 和 textarea,具有 onChange 事件。onChange 事件是一个非常有用、非常常见的事件,用于捕获输入框中的文本变化。有时候,我们需要将多个参数同时传递给 onChange 事件处理函数,在本文中,我们将介绍如何实现这一目标。
网络技术联盟站
2023/06/07
2.7K0
【笔记php】如何使用PHP从JSON提取数据?
2022年8月26日16点36分 如何使用PHP从JSON提取数据? 不多bb,直接上示例 一 $Json = ' { "type": "fish9.cn", "name": "fish9.cn" }'; $fish = Json_decode($Json,true); echo $fish["type"]; //结果fish9.cn 二 $Json = '{ "type":"fish9.cn", "name":"fish9.cn", "daily":[{
吃猫的鱼Code
2023/02/02
4.9K0
js如何将json字符串转成json对象_前端json字符串转json对象
JSON字符串: var str1 = ‘{ “name”: “cxh”, “sex”: “man” }’; JSON对象: var str2 = { “name”: “cxh”, “sex”: “man” };
全栈程序员站长
2022/11/08
9.4K0
WebView 和 JS 交互,如何将 Java 对象和 List 传值给 JS ?
随着混合开发模式比较流行,很多时候,我们需要在原生的基础上,使用 WebView 加载网页,这样控制更加方便。今天我们来看看,如何将 Java 对象 和 List 集合传值给 JS 调用。 1 如何将 Java 对象实例传值给 JS 其实将我们在 Android 原生中将 Java 对象实例传值给 JS 承认并且可以使用的对象,方法非常简单。我们来举个例子。 1.1 Html 文件 我们在本地写了一个 html 文件,放在 assets 目录中。 <!DOCTYPE html> <html> <he
非著名程序员
2018/02/09
8.6K0
WebView 和 JS 交互,如何将 Java 对象和 List 传值给 JS ?
PHP数组转json遇到的问题汇总
数据库中的浮点数会自动转成字符串,这个是正常的,特别注意不要直接通过json传递浮点数,会出现精度丢失或错乱的问题,所以还是转字符串后传递为好。
超级小可爱
2023/02/20
1.2K0
PHP csv文件内容转成数组/Json
$lines = array_map('str_getcsv', file($filePath));; $result = array(); $headers = null; if (count($lines) > 0) { $headers = $lines[0]; } for($i=1; $i<count($lines); $i++) { $obj = $lines[$i]; $result[] = array_combine($headers, $obj);//转成数组
悟空聊架构
2018/06/26
1.6K0

相似问题

将php数组传递给json文件(PHP ->Json->JS)

24

如何将JS数组传递给PHP

24

如何将json值php传递给js

50

将数组从php传递给js

30

如何将PHP数组传递给JS并生成JS数组

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文