Haskell默认超类实例

Haskell默认超类实例,haskell,typeclass,boilerplate,Haskell,Typeclass,Boilerplate,我想为一些自定义类(称它们为单项式和多项式)从Num声明中提取一些样板文件。而不是写作 instance Num (Monomial) where f - g = f + (negate g) abs _ = undefined 有没有办法绕过这个问题?我遇到了一个名为“”的东西,如果实现它,我可能会写这样的东西 class SimpleNum a => Num a where (+) :: a -> a -> a -- standard ring s

我想为一些自定义类(称它们为单项式和多项式)从Num声明中提取一些样板文件。而不是写作

instance Num (Monomial) where
    f - g = f + (negate g)
    abs _ = undefined
有没有办法绕过这个问题?我遇到了一个名为“”的东西,如果实现它,我可能会写这样的东西

class SimpleNum a => Num a where
    (+) :: a -> a -> a -- standard ring stuff
    (*) :: a -> a -> a
    one :: a
    zero :: a
    instance Num (SimpleNum a) where
        f - g = f + (negate g)
        abs _ = undefined

通常/简单的处理方法是什么?

通常的处理方法是至少执行以下一项或多项操作:

  • 抱怨很多

  • 编写以下帮助器函数:

  • 单纯形f g=f+(否定g)
  • 使用诸如和之类的工具

  • 尝试实现您提到的扩展。(不幸的是,这并不像你想象的那么容易。)


  • 也许这部分是因为Num的设计不是很好,也就是说,它应该是AbelianGroup=>Ring=>Num…这是它的一部分,但是我们不能在更具体的类型类的成员方面为不太具体的类型类的方法设置默认值,所以这也太糟糕了:-(.虽然至少我们的代码不需要所有这些免费的底部…她已经实现了。我不知道这个功能是否实现了,但她是一个真正的预处理器,你可以使用。你知道数字的前奏吗?它至少提供了一个更合理的数字。@John L:非常感谢,这非常有帮助!!谢谢,我可能只是这次写它是因为我只有几个函数,但很高兴了解模板Haskell和派生。 simpleMinus f g = f + (negate g)