为什么haskell里需要monoid
展开全部
因为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) 太难就没有深入进去了
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) 太难就没有深入进去了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询