【问题标题】:Haskell default superclass instancesHaskell 默认超类实例
【发布时间】:2011-05-03 02:53:21
【问题描述】:

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

instance Num (Monomial) where
    f - g = f + (negate g)
    abs _ = undefined

有没有办法解决这个问题?我遇到了default superclass instances 和一个叫做“the strathclyde haskell enhancement”的东西,如果实现它可能会让我写出类似的东西,

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

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

【问题讨论】:

  • 也许这部分是 Num 的设计不是很好的问题,即它应该是 AbelianGroup => Ring => Num ...
  • 这是其中的一部分,但是就更具体的类型的成员而言,我们不能为不太具体的类型类的方法设置默认值,所以这真的太糟糕了:-(。虽然至少那时我们的代码不必有所有这些无缘无故的底部......
  • SHE 已实现。不知道是不是这个功能,但是SHE是一个真正可以使用的预处理器。
  • 您知道数字前奏曲haskell.org/haskellwiki/Numeric_Prelude 吗?它至少提供了一个更合理的 Num。
  • @John L:非常感谢,很有帮助!!

标签: haskell typeclass boilerplate


【解决方案1】:

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

  1. 牢骚满腹。

  2. 像这样编写辅助函数:

simpleMinus f g = f + (负 g)
  1. 使用Template HaskellDerive 等工具。

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

【讨论】:

  • 谢谢,这次我可能会写它,因为我只有几个函数,但是很高兴了解 Template Haskell 和 Derive。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多