广义类型 - 默认规则

mar*_*iop 6 haskell type-systems

如果出现以下情况,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
Run Code Online (Sandbox Code Playgroud)

GHCi以这种方式扩展了这套规则:

  • 所有类Ci都是单参数类型.
  • Ci类中的至少一个是数字,或者是Show,EqOrd.

GHC有一个名为ExtendedDefaultRules的扩展,可以启用这些规则.但是这个扩展非常具体:它只适用于GHC和标准类.例如,可以考虑不使用标准库的库.在这种情况下,GHCi扩展将不起作用.

我的问题是:扩展Haskell的类型默认规则(如GHCi)的唯一方法是使用编译器扩展吗?更通用:有没有办法根据Haskell 98中约束的某些规则来定义类型默认?

aug*_*tss 7

没有办法做你想要的.

目前的情况因设计而变得贫穷.我们的想法是做一些最小的事情,将来我们有一个好的设计可以扩展.