Haskell の型デフォルト規則は、次の場合、制約(C1 a,...,Cn a)を持つ型変数aをデフォルトに設定します。
- 型変数aは他の制約には現れません
- すべてのクラスCiは標準です。
- クラスCiの少なくとも 1 つが数値である
これは私には理にかなっていますが、非常に限定的でもあります。実際には、カスタム クラスを操作するときにあいまいな場合は常に型を指定する必要があることを意味します。たとえば、これはコンパイルされません:
class (Show a) => MyShow a where
myShow :: a -> String
myShow = show
instance (MyShow a) => MyShow (Maybe a) where
myShow Nothing = "Nothing"
myShow (Just x) = "Just " ++ (myShow x)
main = print $ myShow Nothing -- ambiguous
GHCi はこの一連の規則を次のように拡張します。
- すべてのクラスCiは、単一パラメーター型のクラスです。
- クラスCiの少なくとも 1 つが数値であるか、Show、Eq、またはOrdです。
GHC には、これらのルールを有効にするExtendedDefaultRulesという拡張機能があります。ただし、この拡張機能は非常に特殊です。GHC と標準クラスでのみ機能します。たとえば、標準ライブラリを使用しないライブラリについて考えることができます。その場合、GHCi 拡張機能は機能しません。
私の質問は、GHCi のように Haskell の型デフォルト規則を拡張する唯一の方法は、コンパイラの拡張機能を使用することですか? もっと一般的な: Haskell 98 の制約に関するいくつかの規則に基づいて、型のデフォルト設定を定義する方法はありますか?