拡張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
(詳細については、これらのブログ 投稿を参照してください)。
この新しいスタイルで基本ライブラリ型クラスのかなりの部分を実装していることに気づきました(基本的に、ボックス化されていないベクトルとリストの間で交換可能に作業できるようにしたい)、このためのライブラリがすでに存在するかどうか疑問に思っています。 、または私が肉付けしてハッキングに追加する必要がある場合。
編集:また、これをベースに直接追加する計画はありますか?クラス定義を直接更新するだけでは、他に何も壊してはならないようです。