我们可以使用扩展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中。
编辑:此外,是否有计划将此直接添加到基地?它似乎不应该通过直接更新类定义来破坏其他任何东西。
答案 0 :(得分:6)
由于听起来没有其他人拥有图书馆,我已将我所做的工作转换为名为ConstraintKinds和uploaded it to github的单独项目。它目前非常简单,可能还没有涵盖任何其他人的用例,但您可以随意进行更改或提交请求。
在将项目上传到hackage之前,我可能会等待更多关于这是否是一个好方向的反馈。