Чи є спосіб змусити 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

11
Я згоден, що це було б корисно. Я повідомив про це як запит на функцію на GHC trac: 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 завдяки квитку на GHC @ DominiqueDevriese .

Через розширений тип дефолту , це не відразу очевидно в 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)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.