从多个实例声明中删除重复

时间:2017-03-23 05:24:01

标签: haskell

我目前的代码遵循以下模式:

f1' x1 x2 .. xm1 = ...
f2' x1 x2 .. xm2 = ...
.
.
,
fn' x1 x2 .. xmn = ...

instance C D1 where
  f1 = f1'
  f2 = f2'
  .
  .
  .
  fn = fn'

instance C D2 where
  f1 = f1'
  f2 = f2'
  .
  .
  .
  fn = fn'

.
.
.

instance C DN where
  f1 = f1'
  f2 = f2'
  .
  .
  .
  fn = fn'

基本上,我有一个我想为多种数据类型实现的类,但所有这些实现都是相同的。但是对于m函数和n实例,实例实现有很多重复的代码,我必须编写大约O(m*n)行代码,我更喜欢它更像O(m+n)

有没有一种好方法可以消除这里的重复?我想模板Haskell可以解决这个问题,但如果处理这个问题已经存在,我不想重新发明轮子。

2 个答案:

答案 0 :(得分:0)

您可以为您的班级提供默认实施。以Functor为例:

class  Functor f  where
    fmap        :: (a -> b) -> f a -> f b

     -- | Replace all locations in the input with the same value.
     -- The default definition is @'fmap' . 'const'@, but this may be
     -- overridden with a more efficient version.
    (<$)        :: a -> f b -> f a
    (<$)        =  fmap . const

您还可以选择deriving选项,您可以在此问题中找到更多信息:How does deriving work in Haskell?有关如何控制deriving的一些信息。

答案 1 :(得分:0)

也许你可以先创建另一个空类型:

class SomeD

然后为每种类型使用一行创建D1 ... DNSomeD个实例:

instance SomeD D1
-- ...
instance SomeD DN

然后将SomeD类型类的任何实例设为C的实例,如下所示:

instance (SomeD t) => C t where
    f1 = f1'
    -- ...
    fn = fn'

(我不确定这是否有效或是否需要一些语言扩展,但遗憾的是我现在无法测试它。)