广义类型 - 默认规则

时间:2013-07-24 15:07:21

标签: haskell type-systems

Haskell's type-defaulting rules默认使用约束(C1 a,...,Cn a)的类型变量 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 类是数字,或显示 Eq Ord

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

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

1 个答案:

答案 0 :(得分:7)

没有办法做你想做的事。

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