основанный на сравнении двух первых параметров.

е удается скомпилировать на 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?

Ответы на вопрос(0)

Ваш ответ на вопрос