Насколько опасно 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
, Сочетание этих двух вещей вполне разумно.