ニュータイプは、特定のクラス コンテキストで使用されたときに、特定の型の動作を変更するためによく使用されます。たとえば、Data.Monoid.AllラッパーをBool使用して、 として使用した場合の動作を変更しMonoidます。
私は現在、さまざまなタイプの広い範囲に適用されるような newtype ラッパーを作成しています。ラッパーは、1 つの特定のクラス インスタンスの動作を変更することになっています。次のようになります。
newtype Wrapper a = Wrapper a
instance Special a => Special (Wrapper a) where
-- ...
ただし、このラッパーを追加すると、ラップされた型の使いやすさが変わることがよくあります。たとえば、以前は function を使用できた場合、mconcat :: Monoid a => [a] -> aラップされた値のリストには使用できなくなりました。
-XGeneralizedNewtypeDerivingもちろんとも使えますnewtype Wrapper a = Wrapper a deriving (Monoid)。ただし、これは問題を解決するだけでMonoid他のクラスは解決しませんが、さまざまなクラスでいっぱいのオープンワールドを扱うことになり、スタンドアロンの孤立した一般化された newtype の派生は実際には実用的なオプションではありません。deriving hiding (Special)理想的には、 ( を除くすべてのクラスを派生させて)書きたいSpecialのですが、もちろん、それは有効な Haskell ではありません。
これを行う方法はありますか、それとも単に失敗してGHC機能リクエストを追加する必要があるのでしょうか?