【发布时间】:2019-09-24 14:44:29
【问题描述】:
我意识到答案可能是存在多个有效的此类实例(例如整数;总和、乘积......)。也许有人有比这更令人满意的答案?
正如 Joachim Breitner 在此答案 How do you implement monoid interface for this tree in haskell? 中出色解释的那样,任何应用程序都有一个 monoid 实例:
mempty :: Applicative f => Monoid a => f a
mempty = pure mempty
mappend :: Applicative f => Monoid a => f a -> f a -> f a
mappend f g = mappend <$> f <*> g
所以我想知道为什么containers 中的Data.Tree.Tree 没有这样的实例?相同的参数可以用于任何其他没有伴随 monoid 实例的 monad。在我看来,他们应该有这样的例子是很自然的。也许情况并非如此。希望有人能赐教。
我想另一个原因可能是我为树提出的实例不是“有用的”。在我看来,这与多个有效实例的论点一样令人不满意。
【问题讨论】:
-
“非空的,可能是无限的,多路树;也称为玫瑰树。” - 我不认为 mempty 可以存在,但可能是错误的。
-
一棵树是
Foldable的一个实例,所以我想这可能会提供一些工具来处理具有属于Monoid实例类型的值的三元组。但我同意将树也设为Monoid的实例可能是有意义的。 -
@Caramiriel:如果它包装的项目也是
Monoid,我们可以将其定义为mempty = Node mempty [] -
@fredefox,
liftA2组合更干净。liftA2 . liftA2 . liftA2表达了在多个函子下提升的想法。
标签: haskell