6

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类中至少有一个类是数字的,或者是ShowEqOrd

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

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

4

1 回答 1

7

没有办法做你想做的事。

目前的情况是设计上的贫困。这个想法是做一些最小的事情,当我们有一个好的设计时,可以在未来扩展。

于 2013-07-24T18:51:34.840 回答