通用GHC重写规则

时间:2016-05-22 22:15:14

标签: haskell ghc generic-programming

我最近向alterF添加了Data.Map个功能,这是Control.Lens.At.at的翻转形式。

alterF :: (Ord k, Functor f)
       => (Maybe a -> f (Maybe a))
       -> k
       -> Map k a
       -> f (Map k a)

alterF旨在提供合理的性能,即使是非常“重”的仿函数,例如[],即使密钥相当昂贵也是如此。不幸的是,它比一个轻量级算子和便宜比较键的更常见情况下的速度要慢一些。

为了补丁,我为Const bIdentity仿函数添加了GHC重写规则,将它们重写为通常更快的更简单的实现。 我即将为(,) b 添加另一个。 我为(,) b添加了一个,然后将其删除。请参阅下面的更新。

但是,我对(,) b需要特定规则这一事实感到有些恼火,因为还有许多其他仿函数遵循相同的模式。特别是,任何时候定义一个仿函数

data F b1 b2 ... a = F e1 ... a ... e_n

e_k没有提到a,我应该能够以同样的方式重写它。有没有办法用GHC RULES做到这一点?或者我是否需要等待一些更通用的重写系统?

更新

可悲的是,我意识到我对双重的重写规则是无效的(它太严格了),并且修复使得它不太明显有益。所以我现在已经取消了这条规则。不过,我认为一般性问题仍然很有意思。

0 个答案:

没有答案