我们可以使用扩展 ConstraintKinds 来扩展基类型类的功能以允许约束。例如,我们可以将未装箱的向量设为函子:
class Functor f where
type FunctorConstraint f x :: Constraint
type FunctorConstraint f x = ()
fmap :: (FunctorConstraint f a, FunctorConstraint f b) => (a -> b) -> f a -> f b
instance Functor VU.Vector where
type FunctorConstraint VU.Vector x = VU.Unbox x
fmap = VU.map
我注意到自己以这种新风格实现了相当大部分的基本库类型类(基本上我希望能够在未装箱的向量和列表之间互换工作),并且想知道是否已经存在我应该使用的库,或者我是否应该充实我的并将其添加到hackage中。
编辑:另外,是否有计划将其直接添加到基地?看起来它不应该仅仅通过直接更新类定义来破坏其他任何东西。