Насколько опасен 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 также, кажется, используется в некоторых довольно популярных пакетах, таких как ограничения.

AllowAmbiguousTypes полностью «безопасен» в том смысле, что он абсолютно надежен, не приведет к отклонениям компилятора и не может привести к ошибкам выполнения, он был просто бесполезен до появления TypeApplications. Комбинация того и другого - вполне разумная вещь.
Alexis King 06.04.2018 05:09

Этот вопрос основан на ответе, который я получил на другой вопрос, в котором для хорошего эффекта использовались как AllowAmbiguousTypes, так и TypeApplications: stackoverflow.com/a/49671162/3040129.

illabout 06.04.2018 05:11

Я не буду возражать, если они оба будут включены по умолчанию - на самом деле, мне бы это очень хотелось. Без них нам нужны дополнительные аргументы proxy a, которые мне кажутся хакерскими: почему я должен передавать значение времени выполнения, которое не несет никакой информации, только для того, чтобы сообщить компилятору, что я хочу использовать тип a? Это должно быть аргументом времени компиляции, и теперь это возможно, если мы будем использовать foo @ a. Неоднозначные типы очень хороши, если у вас есть приложения типа. Теперь у них нет обратной стороны.

chi 06.04.2018 11:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
330
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

AllowAmbiguousTypes is completely safe, in the sense that it is perfectly sound, will not make the compiler diverge, and cannot lead to runtime errors. It was just mostly useless prior to the introduction of TypeApplications. The combination of the two is a perfectly reasonable thing.

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