Haskell's type-defaulting rules默认使用约束(C1 a,...,Cn a)的类型变量 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
GHCi以这种方式扩展了这套规则:
和GHC有一个名为 ExtendedDefaultRules 的扩展,可以启用这些规则。但是这个扩展非常具体:它只适用于GHC和标准类。例如,可以考虑不使用标准库的库。在这种情况下,GHCi扩展将不起作用。
我的问题是:扩展Haskell的类型默认规则(如GHCi)的唯一方法是使用编译器扩展吗?更通用:有没有办法根据Haskell 98中约束的一些规则来定义类型默认?
答案 0 :(得分:7)
没有办法做你想做的事。
目前的情况因设计而变得贫穷。我们的想法是做一些最小的事情,将来我们有一个好的设计可以扩展。