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


103

当前行为

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


16
AFAIK,目前尚无法实现,但肯定会有用。为此,可能值得在GHC错误跟踪器上打开功能请求。
kosmikus 2014年

11
我同意这将是有用的。我在GHC 追踪中将
Dominique Devriese 2014年

4
现在你可以使用预型孔绝招:show (undefined :: () -> ()); GHC将在类型检查错误中提供更多信息。
phadej 2014年

1
这是功能要求还是实际问题?也就是说,您是否确定无法按照自己的意愿制作GHC,或者是否有可能通过当前的编译器获得所需的内容,但是不确定如何?
stakx-不再对2015年

1
@stakx两者都有一点。最初,当我写这个问题时,我很困惑为什么GHC不提供类型类约束,并且以为我在使用类型化的孔时错了。然后有人告诉我,目前无法做到这一点,但可以将其添加到GHC中。因此,我希望很快将其添加。许多人似乎想使用它。phadej的技巧似乎在同时起作用,但不如基于打孔的解决方案那么优雅或易于使用。
Wizek

Answers:


2

由于@DominiqueDevriese的GHC票证,现在已在GHC 8.0中修复此问题。

由于扩展类型默认值,这在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)

孔的类型默认为()。这显然是期望的行为,尽管有一个论点认为扩展默认值不应该应用于空洞(因为它们的常见用法是让编译器告诉您推断的类型)。

不过,如果您使用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)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.