我一直在为我创建的一种数据类型实现Foldable
,我想知道是否应该在类型类中实现foldr
和其他可选函数。
我查看了文档,但这只解释了函数,而不是我应该在我自己的版本上实现它还是默认版本没问题。然后我研究了实现,这使得事情变得更加复杂,因为有些函数使用#.
代替.
来修复某种低效率,我不确定我的实现是否会消除或如何我发现了。
我也尝试谷歌搜索并在Stack Overflow上搜索,但遗憾的是找不到任何相关内容。
那么我该如何决定是否应该实现像Foldable
这样更复杂的类型类的可选函数?
答案 0 :(得分:1)
我喜欢的示例(并且不理解为什么它不是实际定义的一部分)mconcat
为Product
。提醒
class Monoid a where
mempty :: a
mappend :: a -> a -> a
mconcat = foldr mappend mempty
Product
实例看起来像
instance Num a => Monoid (Product a) where
mempty = Product 1
(Product x) `mappend` (Product y) = Product (x * y)
现在,使用默认的mconcat
,mconcat (map Product [1..10])
必须将所有数字相乘以得到0的最终答案。(事实上,对于无限列表,函数永远不会终止。)< / p>
如果mconcat
已替换为
mconcat = foldr (\acc v -> if v == Product 0 then Product0 else mappend acc v) mempty
然后mconcat
可能会在第一次看到列表中的Product 0
时返回Product 0
。