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

(詳細については、これらのブログ 投稿を参照してください)。

この新しいスタイルで基本ライブラリ型クラスのかなりの部分を実装していることに気づきました(基本的に、ボックス化されていないベクトルとリストの間で交換可能に作業できるようにしたい)、このためのライブラリがすでに存在するかどうか疑問に思っています。 、または私が肉付けしてハッキングに追加する必要がある場合。


編集:また、これをベースに直接追加する計画はありますか?クラス定義を直接更新するだけでは、他に何も壊してはならないようです。

4

1 に答える 1

6

他に誰もライブラリを持っていないように思われるので、私が行ったことをConstraintKindsという別のプロジェクトに変換し、それをgithubにアップロードしました。現時点では非常にシンプルで、おそらくまだ他の人のユースケースをカバーしていませんが、自由に変更を加えたり、リクエストを送信したりできます。

プロジェクトをハッキングにアップロードする前に、これが良い方向であるかどうかについてのフィードバックを待つでしょう。

于 2012-10-03T19:11:19.093 に答える