有没有办法让GHC提供类型孔的类型类约束?

时间:2014-04-12 08:35:38

标签: haskell types ghc

当前行为

Prelude> show _

<interactive>:7:6:
    Found hole ‘_’ with type: a0
    Where: ‘a0’ is an ambiguous type variable
    Relevant bindings include it :: String (bound at <interactive>:7:1)
    In the first argument of ‘show’, namely ‘_’
    In the expression: show _
    In an equation for ‘it’: it = show _

期望的行为

如果GHC还告诉我输入的孔有Show类型类约束,那将是很好的。

其它

GHC版本7.8.1

3 个答案:

答案 0 :(得分:2)

由于@ DominiqueDevriese的GHC ticket,现在已在GHC 8.0中修复。

由于extended type defaulting,这在GHCi中并不是很明显。用你的例子,

> show _

  <interactive>:7:6: error:
    • Found hole: _h :: ()
      Or perhaps ‘_h’ is mis-spelled, or not in scope
    • In the first argument of ‘show’, namely ‘_h’
      In the expression: show _h
      In an equation for ‘it’: it = show _h
    • Relevant bindings include
        it :: String (bound at <interactive>:7:1)

洞的类型默认为()。这显然是desired behavior,尽管有一个论点要求扩展的默认不应该适用于漏洞(因为它们的常见用途是让编译器告诉你推断的类型)。

然而,如果您使用GHC进行编译或在GHCi中禁用扩展默认规则(通过:set -XNoExtendedDefaultRules),我们会看到改进的结果:

<interactive>:3:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘show’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In the expression: show _
      In an equation for ‘it’: it = show _

<interactive>:3:6: error:
    • Found hole: _ :: a0
      Where: ‘a0’ is an ambiguous type variable
    • In the first argument of ‘show’, namely ‘_’
      In the expression: show _
      In an equation for ‘it’: it = show _
    • Relevant bindings include
        it :: String (bound at <interactive>:3:1)

答案 1 :(得分:1)

目前暂不可行。但可以根据推测将其添加到GHC。

答案 2 :(得分:1)

在GHC 8.8+中尝试it :: _ => _