我最近向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 b
和Identity
仿函数添加了GHC重写规则,将它们重写为通常更快的更简单的实现。 我即将为添加另一个。 我为(,) b
(,) b
添加了一个,然后将其删除。请参阅下面的更新。
但是,我对(,) b
需要特定规则这一事实感到有些恼火,因为还有许多其他仿函数遵循相同的模式。特别是,任何时候定义一个仿函数
data F b1 b2 ... a = F e1 ... a ... e_n
e_k
没有提到a
,我应该能够以同样的方式重写它。有没有办法用GHC RULES
做到这一点?或者我是否需要等待一些更通用的重写系统?
可悲的是,我意识到我对双重的重写规则是无效的(它太严格了),并且修复使得它不太明显有益。所以我现在已经取消了这条规则。不过,我认为一般性问题仍然很有意思。