Haskell 的类型默认规则默认类型变量a具有约束(C1 a,...,Cn a)如果:
- 类型变量a没有出现在其他约束中
- 所有类别Ci都是标准的。
- Ci类中至少有一个是数字的
这对我来说很有意义,但也非常有限:实际上,这意味着当您使用自定义类时,当它不明确时,您总是必须指定类型。例如,这不会编译:
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类中至少有一个类是数字的,或者是Show、Eq或Ord。
GHC 有一个名为ExtendedDefaultRules的扩展来启用这些规则。然而,这个扩展非常具体:它只适用于 GHC 和标准类。例如,可以考虑不使用标准库的库。在这种情况下,GHCi 扩展将不起作用。
我的问题是:像 GHCi 一样扩展 Haskell 的类型默认规则的唯一方法是使用编译器扩展?更通用的是:有没有一种方法可以根据 Haskell 98 中约束的一些规则来定义类型默认?