如果这是一个有点模糊的问题我很抱歉,我只是想知道我正朝着正确的方向前进。 (GHC 8.0.2)
我有一个“类似列表”的数据类型,我们称之为T a
。例如,它是Foldable
,Functor
和Monoid
的实例。
我想制定一些规则,例如(粗略地说,这里没有使用确切的语法):
您可以折叠两个列表,只需折叠第一个然后折叠第二个(不需要实际附加列表):
foldl'f z(x ++ y) - > foldl'f(foldl'f z x)y
如果您正在折叠已映射的列表,您只需将地图功能拖动到折叠中,即可删除地图:
foldl'f z(fmap x) - >令h x y = f x(g y)in foldl h z x
如果要映射附加列表,只需映射各个列表,然后附加它们:
fmap(x ++ y) - > fmap x ++ fmap y
我该怎么做?我目前所做的是让我的实例方法调用顶级方法,如fmap'
,它完成所有工作,然后我将规则应用于这些方法。但是-ddump-rule-rewrites
似乎没有显示我的规则触发,但有很多Class op *
规则触发,例如Class op fmap
和Class op foldl'
我应该是:
一个。做我正在做的事情?
湾直接在类方法上应用我的规则?
C。标准类规则应该涵盖我的数据类型的情况,没有必要做任何事情?要么
d。上述内容的某种组合,涉及INLINE
和NOINLINE
pragma在适当状态下的混合(请详细说明)。
我怀疑答案是(d),我只是想要一些指导来开始。