4

Haskell の GeneralizedNewtypeDeriving メカニズムは優れています。見ていない人のために、次のように書いてください。

newtype SkewOptT  α = SkewOptT (StateT Bool  α)
    deriving (Applicative, Functor, Monad, MonadTrans)

のようなインスタンスを自動的に生成します。

instance [overlap ok] Monad  => Monad (SkewOptT )

ただし、私の型クラスの 1 つで、いくつかのメソッドをカスタマイズしたいと考えています。これらのメソッドに対して GeneralizedNewtypeDeriving が行うことをオーバーライドまたは無効にする方法はありますか? for型クラスは、(ループ)、parfor(並列ループ)、 (新しい関数の追加)などのいくつかの基本的な DSL 命令をエンコードしますfcndefが、それを複数の型クラスに分割する完全な方法はありません [その後、自動的に派生します。一方は手動で作成し、もう一方は手動で記述します]。

4

1 に答える 1

4

いいえ、これは不可能です。ただし、デフォルトの署名(GHC 7.2 の新機能) は、ここでクラスを分割するのに役立つかもしれません。他の型クラスに関してメソッドのデフォルトの実装を定義できるため、いくつかのインスタンスを派生させ、別のクラスのインスタンスでオーバーライドしたいメソッドだけを埋めることができる場合があります。

実際、 と を除いてShowReadnewtype の派生は、いくつかの前提条件が満たされていることを確認するだけで、辞書を直接再利用します (newtype は基礎となる型と同じ表現を持っているため)。詳細については、ドキュメントを参照してください。

于 2012-01-01T21:49:55.360 に答える