显然,如果数据结构是一个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 (:[]) aTwoThings始终具有两个元素。但是第二定律在左边有两个元素,在右边有四个元素。但是dfeuer's answer显示,不需要法律来找到反例。

07-26 04:27