折叠以上功能 - 幺半群
Folds above functions - monoids
为什么列表长度以上的折叠不是幺半群?
length = foldr (\_ n -> 1+n) 0
它不是结合的并且有中性元素0
所以它应该是一个幺半群吗?
我很难理解你真正想问的是什么,我怀疑你演讲中的确切措辞可能很重要。
但是根据我能想到的最直观的解释,我认为你是对的,因为在数学上,length
函数 是 一个 "monoid homomorphism",映射幺半群列表的连接操作到整数的幺半群与加法操作。
从技术上讲,在 Haskell 中并非如此,但主要是因为数字类型没有被赋予 Monoid
实例,因为有两种明显的运算可供选择,即加法和乘法。另一个原因是 Haskell 中的列表可以是无限的,因此 length
并不总是给出结果。
为什么列表长度以上的折叠不是幺半群?
length = foldr (\_ n -> 1+n) 0
它不是结合的并且有中性元素0
所以它应该是一个幺半群吗?
我很难理解你真正想问的是什么,我怀疑你演讲中的确切措辞可能很重要。
但是根据我能想到的最直观的解释,我认为你是对的,因为在数学上,length
函数 是 一个 "monoid homomorphism",映射幺半群列表的连接操作到整数的幺半群与加法操作。
从技术上讲,在 Haskell 中并非如此,但主要是因为数字类型没有被赋予 Monoid
实例,因为有两种明显的运算可供选择,即加法和乘法。另一个原因是 Haskell 中的列表可以是无限的,因此 length
并不总是给出结果。