显然,如果数据结构是一个monoid,它是可折叠的,但是可以确定地说,如果一个数据结构是可折叠的,它是一个monoid?
https://en.wikibooks.org/wiki/Haskell/Foldable
如果数据结构是可折叠的,那么它是否是monoid?
最佳答案
您声称“如果数据结构是Monoid
则是Foldable
”,这是不合理的。例如:
newtype ActionList a = ActionList (IO [a])
instance Monoid (ActionList a) where
mempty = ActionList (return [])
ActionList a `mappend` ActionList b = ActionList (liftA2 (++) a b)
这是一个非常好用的类人动物。但是由于它的所有值都在
IO
下,因此您无法从Foldable
观察到它们中的任何一个。唯一的Foldable
实例将是一个始终返回空的实例(从技术上讲,这是有效的,因为foldMap
的确没有关于其有效性的任何定律,但很难说这是一个挺直的好实例)。您要问的相反情况也不正确。例如:
data TwoThings a = TwoThings a a
这是可折叠的:
instance Foldable TwoThings where
foldMap f (TwoThings x y) = f x <> f y
但是,如果在任何相关方式上东西既是
Foldable
又是Monoid
,我希望以下同态定律成立:foldMap f mempty = mempty
foldMap f (a <> b) = foldMap f a <> foldMap f b
而且我们无法使这些法律适用于
TwoThings
。请注意,foldMap (:[]) a
的TwoThings
始终具有两个元素。但是第二定律在左边有两个元素,在右边有四个元素。但是dfeuer's answer显示,不需要法律来找到反例。