Есть ли способ заставить 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

Wizek
источник
16
AFAIK, в настоящее время это невозможно, но, безусловно, было бы полезно. Возможно, для этого стоит открыть запрос функции на трекере ошибок GHC.
Космикус
11
Я согласен, что это было бы полезно. Я сообщил об этом как о запросе функции на трассе GHC: ghc.haskell.org/trac/ghc/ticket/9479
Доминик Девриз
4
На данный момент вы можете использовать предварительно типа отверстий трюк: show (undefined :: () -> ()); GHC расскажет больше об ошибке проверки типа.
phadej
1
Это запрос функции или актуальный вопрос? То есть знаете ли вы наверняка, что нет способа сделать GHC так, как вы хотите, или есть вероятность, что вы можете получить то, что хотите, с помощью текущего компилятора, но вы не знаете, как?
stakx - больше не участвует
1
@stakx Это и то, и другое. Первоначально, когда я писал этот вопрос, я был сбит с толку, почему GHC не предоставил ограничения класса типов, и думал, что я неправильно использовал типизированные дыры. Затем некоторые сказали мне, что в настоящее время это невозможно, но можно добавить в GHC. Так что я надеялся, что он скоро будет добавлен. Многие, кажется, хотели бы им воспользоваться. Уловка phadej, кажется, работает в настоящее время, но не так элегантна и проста в использовании, как решение на основе типизированных отверстий.
Wizek

Ответы:

2

Сейчас эта проблема решена в GHC 8.0 благодаря @ DominiqueDevriese в GHC билет .

Из-за использования расширенного типа по умолчанию это не сразу очевидно в 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)
Crockeea
источник
1

Нет, в настоящее время это невозможно, но, согласно предположениям, он может быть добавлен в GHC.

Викас Ананд
источник
1

Попробуйте it :: _ => _в GHC 8.8+.

Михал Гайда
источник