mar*_*iop 6 haskell type-systems
如果出现以下情况,Haskell的类型默认规则会默认带有约束的类型变量a (C1 a,...,Cn a):
这对我来说很有意义,但它也非常有限:在实践中,这意味着当你使用自定义类时,它总是必须指定类型.例如,这不编译:
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
Run Code Online (Sandbox Code Playgroud)
GHCi以这种方式扩展了这套规则:
GHC有一个名为ExtendedDefaultRules的扩展,可以启用这些规则.但是这个扩展非常具体:它只适用于GHC和标准类.例如,可以考虑不使用标准库的库.在这种情况下,GHCi扩展将不起作用.
我的问题是:扩展Haskell的类型默认规则(如GHCi)的唯一方法是使用编译器扩展吗?更通用:有没有办法根据Haskell 98中约束的某些规则来定义类型默认?