ニュータイプは、特定のクラス コンテキストで使用されたときに、特定の型の動作を変更するためによく使用されます。たとえば、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機能リクエストを追加する必要があるのでしょうか?