Мы можем использовать расширение ConstraintKinds для расширения функциональности классов базового типа, чтобы разрешить ограничения. Например, мы можем сделать unboxed vector функтором:
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
(см. blog сообщения для более подробнее).
Я заметил, что я реализую довольно большую часть классов базового типа библиотеки в этом новом стиле (в основном я хочу иметь возможность работать взаимозаменяемо между unboxed векторами и списками), и мне интересно, существует ли библиотека для этого уже существует Я должен использовать, или если бы я должен был выманить себя и добавить его в хакерство.
Изменить: Кроме того, планируется ли добавить это прямо на базу? Похоже, что он не должен ломать ничего, просто обновляя определения классов напрямую.