折叠以上功能 - 幺半群

Folds above functions - monoids

为什么列表长度以上的折叠不是幺半群?

length = foldr (\_ n -> 1+n) 0

它不是结合的并且有中性元素0所以它应该是一个幺半群吗?

我很难理解你真正想问的是什么,我怀疑你演讲中的确切措辞可能很重要。

但是根据我能想到的最直观的解释,我认为你是对的,因为在数学上,length 函数 一个 "monoid homomorphism",映射幺半群列表的连接操作到整数的幺半群与加法操作。

从技术上讲,在 Haskell 中并非如此,但主要是因为数字类型没有被赋予 Monoid 实例,因为有两种明显的运算可供选择,即加法和乘法。另一个原因是 Haskell 中的列表可以是无限的,因此 length 并不总是给出结果。