【发布时间】:2020-05-20 14:55:30
【问题描述】:
我正在 Haskell 中试验 Foldable 类型类,使用以下数据类型作为示例:
data Tree a = Empty
| Node (Tree a) a (Tree a)
如果我使用DeriveFoldable GHC 扩展,它似乎会按照以下方式派生一个Foldable 实例
instance Foldable Tree where
foldMap _ Empty = mempty
foldMap f (Node l n r) = (foldMap f l) <> (f n) <> (foldMap f r)
即树的中序遍历。但是,我没有看到任何明显的阻止不同 Foldable 实例的情况,例如前序遍历:
instance Foldable Tree where
foldMap _ Empty = mempty
foldMap f (Node l n r) = (f n) <> (foldMap f l) <> (foldMap f r)
Foldable 类型类是否有法律规定前序遍历实例是非法的?
【问题讨论】:
-
之所以这么推导是因为它使用了参数的顺序,如果你定义为
Node a (Tree a) (Tree a),就是前序遍历。 -
对于仿函数实例,它应该满足
foldMap f = fold . fmap f(如文档中所指定)。 -
我没有看到使用预购遍历定义它的问题。虽然我觉得使用
Node a (Tree a) (Tree a)这样做更有意义,但从那时起,数据结构“暗示”了可折叠的外观。 -
@WillemVanOnsem 所以简而言之,没有任何法律限制如何创建实例,
DeriveFoldable只是使用参数顺序?听起来不错的答案。 -
嗯,它应该满足一些规律,比如
sum = getSum . foldMap Sum等来总结类型。本质上,这个想法是你把它折叠起来,以满足一元法则。