Есть ли библиотека, которая использует ConstraintKinds для обобщения всех классов базовых типов, чтобы разрешить ограничения?

Мы можем использовать расширение 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

(См. Эти сообщения в блоге для более подробной информации).

Я заметил, что реализую довольно большую часть базовых классов типов библиотек в этом новом стиле (в основном я хочу иметь возможность работать взаимозаменяемо между неупакованными векторами и списками), и мне интересно, существует ли уже библиотека для этого, которую я должен использовать или если я должен наметить свою и добавить ее в рубить.


Изменить: Кроме того, есть ли планы добавить это непосредственно в базу? Кажется, что это не должно нарушать ничего, просто обновляя определения классов напрямую.

1 ответ

Решение

Поскольку, похоже, ни у кого нет библиотеки, я преобразовал то, что сделал, в отдельный проект ConstraintKinds и загрузил его в github. На данный момент это чрезвычайно просто и, вероятно, пока не охватывает ни одного другого случая использования, но вы можете вносить свои изменения или отправлять запросы.

Я, вероятно, подожду дополнительных отзывов о том, является ли это хорошим направлением, прежде чем загружать проект в Hackage.

Другие вопросы по тегам