我目前的代码遵循以下模式:
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可以解决这个问题,但如果处理这个问题已经存在,我不想重新发明轮子。
答案 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
... DN
个SomeD
个实例:
instance SomeD D1
-- ...
instance SomeD DN
然后将SomeD
类型类的任何实例设为C
的实例,如下所示:
instance (SomeD t) => C t where
f1 = f1'
-- ...
fn = fn'
(我不确定这是否有效或是否需要一些语言扩展,但遗憾的是我现在无法测试它。)