为什么haskell里需要monoid

 我来答
城南明月羿当年
2015-04-21 · 知道合伙人生活技巧行家
城南明月羿当年
知道合伙人生活技巧行家
采纳数:24666 获赞数:123229
计算机爱好者

向TA提问 私信TA
展开全部
因为monoid是种很广泛的代数结构, 一旦可以利用这代数结构的性质做些什么事情, 同样也可以应用到满足这些性质的数据类型(instance).
monoid的广泛是因为它的"简单": 一个集合, 一个满足结合律的封闭二元运算(mappend), 一个单位元(mempty). 例如最经常处理的一种数据类型: 字符串. 集合就是字符集各种字符组成的字符串, 二元运算就是字符串连接(++), 单位元就是空串("")
一些性质:
"abc" ++ "" == "abc"
("a" ++ "bb") ++ "ccc" == "a" ++ ("bb" ++ "ccc")
满足结合律一个好处就是: 结果跟运算顺序无关
例如:
"a" ++ "bb" ++ "ccc" ++ "dddd" + "eeeee" + "ffffff" -- 可以拆分成:
("a" ++ "bb" ) ++ ("ccc" ++ "dddd") ++ ("eeeee" ++ "ffffff" )
这样可以几个部分可以分别一起计算.
然后,有个处理monoid这种数据结构很常用的函数fold (foldl, foldr,可能更加常见的名字是reduce)
用fold实现map算是学FP里一道经典习题了==, 还有fold的一些性质可以让编译器做优化(stream fusion)或者做程序的Reasoning, 可以看ref.

这些都是FP里比较基本的抽象,不限于在Haskell里应用, 更深入点关于monoid, fold的推广(recursion schemes) 太难就没有深入进去了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式