20

我们可以使用扩展 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中。


编辑:另外,是否有计划将其直接添加到基地?看起来它不应该仅仅通过直接更新类定义来破坏其他任何东西。

4

1 回答 1

6

因为听起来没有其他人有图书馆,所以我将我所做的转换为一个名为 ConstraintKinds 的单独项目并将其上传到 github。目前它非常简单,可能还没有涵盖任何其他人的用例,但您可以随意进行更改或提交请求。

在将项目上传到 hackage 之前,我可能会等待更多关于这是否是一个好的方向的反馈。

于 2012-10-03T19:11:19.093 回答