Насколько опасно AllowAmbiguousTypes при использовании с TypeApplications?

Насколько опасно AllowAmbiguousTypes расширение при использовании с TypeApplications расширение?

Руководство GHC дает следующий пример неоднозначного типа:

class C a

f :: C a => Int
f = 3

Это не компилируется, когда не используется AllowAmbiguousTypes со следующим сообщением:

file.hs:8:6: error:
    • Could not deduce (C a0)
      from the context: C a
        bound by the type signature for:
                   f :: forall a. C a => Int
        at file.hs:8:6-15
      The type variable ‘a0’ is ambiguous
    • In the ambiguity check for ‘f’
      To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
      In the type signature: f :: C a => Int
  |
8 | f :: C a => Int
  |      ^^^^^^^^^^

С AllowAmbiguousTypes, он правильно компилируется.

Тем не менее, следующий пример не скомпилируется даже с AllowAmbiguousTypes:

class C a

f :: C a => Int
f = 3

g :: C a => Int
g = f

Выдает следующую ошибку при попытке его скомпилировать:

file.hs:12:5: error:
    • Could not deduce (C a0) arising from a use of ‘f’
      from the context: C a
        bound by the type signature for:
                   g :: forall a. C a => Int
        at file.hs:11:1-15
      The type variable ‘a0’ is ambiguous
    • In the expression: f
      In an equation for ‘g’: g = f
   |
12 | g = f
   |     ^

Это можно записать, включив TypeApplications и писать это следующим образом:

class C a

f :: C a => Int
f = 3

g :: forall a. C a => Int
g = f @a

AllowAmbiguousTypes звучит страшно, но на основании описания в руководстве GHC, это кажется довольно мягким, особенно при использовании с TypeApplications,

Это не как AllowAmbiguousTypes собирается вызвать ошибки во время выполнения, не так ли?

Это сочетание AllowAmbiguousTypes а также TypeApplications также, кажется, используется в некоторых довольно популярных пакетах, таких как ограничения.

1 ответ

Решение

Алексис Кинг прибила это в своем комментарии; это заслуживает того, чтобы быть поднятым до уровня ответа.

AllowAmbiguousTypes полностью безопасен, в том смысле, что он совершенно надежен, не приводит к отклонению компилятора и не может привести к ошибкам во время выполнения. Это было в основном бесполезно до введения TypeApplications, Сочетание этих двух вещей вполне разумно.

Другие вопросы по тегам