основанный на сравнении двух первых параметров.
е удается скомпилировать на GHC 8.0 с ошибкой
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
-- I know this particular example is silly.
-- But that's not the point here.
g :: forall a . RealFloat a => Bool
g = True
main :: IO ()
main = print (g @Double)
Итак, добавление
• Could not deduce (RealFloat a0)
from the context: RealFloat a
bound by the type signature for:
g :: RealFloat a => Bool
at app/Main.hs:3:6-35
The type variable ‘a0’ is ambiguous
• In the ambiguity check for ‘g’
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
In the type signature:
g :: forall a. RealFloat a => Bool
сделает код скомпилированным.AllowAmbiguousTypes
Вот мои вопросы:
Что именно
Зачем нужно, чтобы этот конкретный код работал?AllowAmbiguousTypes
?Боюсь что добавление дает мне больше, чем я действительно хочу в этом конкретном коде. Звучит страшно. Похоже, это сделает систему типов Хаскелла менее безопасной, возможно, в других областях, которые не имеют ничего общего с этим конкретным кодом. Эти страхи необоснованны?AllowAmbiguousTypes
Есть ли альтернативы? В этом случае кажется, что Haskell вставляет переменная типа, которую я никогда не просил. Разве нет расширения, которое говорило бы Хаскеллу не создавать эти посторонние переменные типа - а использовать только те, которые я явно сказал, чтобы добавить их с моим собственным явнымa0
Добавлен один вопрос из-заforall a
?user2407038комментарий: скажешь это неправильно? Было бы лучше назватьAllowAmbiguousTypes
Неоднозначный тип - это тип, имеющий в своем контексте переменную типа, которая не упоминается в теле (то есть справа отAllowUnusedTypeVariables
?