何时在类型类

时间:2016-09-15 20:02:24

标签: haskell typeclass

我一直在为我创建的一种数据类型实现Foldable,我想知道是否应该在类型类中实现foldr和其他可选函数。

我查看了文档,但这只解释了函数,而不是我应该在我自己的版本上实现它还是默认版本没问题。然后我研究了实现,这使得事情变得更加复杂,因为有些函数使用#.代替.来修复某种低效率,我不确定我的实现是否会消除或如何我发现了。

我也尝试谷歌搜索并在Stack Overflow上搜索,但遗憾的是找不到任何相关内容。

那么我该如何决定是否应该实现像Foldable这样更复杂的类型类的可选函数?

1 个答案:

答案 0 :(得分:1)

我喜欢的示例(并且不理解为什么它不是实际定义的一部分)mconcatProduct。提醒

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)

现在,使用默认的mconcatmconcat (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