generated at
型族に部分適用できない
型シノニム族(type family)を例えば Type -> Type のような型パラメータとして渡すことはできないため、extensibleのレコードを活用する上でしばしば不便となる。

newtypeでラッパーを作る

incrementalパッケージで使われている方法。
haskell
class Incremental a where type Diff a diff :: a -> a -> Maybe (Diff a) newtype WrapDelta h x = WrapDelta { unwrapDelta :: Maybe (Delta (h x)) } instance WrapForall Incremental h xs => Incremental (h :* xs) where type Delta (h :* xs) = WrapDelta h :* xs

データ族にする
そもそもデータ族ならこの問題は発生しない。しかし、全部のインスタンスについて個別のデータコンストラクタを定義するのはなかなか面倒ではある。

関連項目