Не удалось вывести (ограниченный a1), возникающий из использования "minBound"

Это, наверное, глупый вопрос, но почему эта функция

myTest :: (Bounded a) => a
myTest = minBound :: a

не typecheck?

это работает

myTest' :: Int
myTest' = minBound :: Int

и они кажутся мне одинаковыми, за исключением того, что нужно было бы ввести первый (например, myTest :: Int), чтобы он работал.

ошибка, которую я получаю, это

• Could not deduce (Bounded a1) arising from a use of ‘minBound’
  from the context: Bounded a
    bound by the type signature for:
               myTest :: Bounded a => a

1 ответов


вы должны включить ScopedTypeVariables С помощью {-# LANGUAGE ScopedTypeVariables #-}, что позволяет использовать переменные типа из сигнатуры функции внутри самой функции. Вам также нужно будет изменить свой пример следующим образом:

{-# LANGUAGE ScopedTypeVariables #-}

myTest :: forall a. (Bounded a) => a
myTest = minBound :: a

на forall указывает компилятору на область a. Определения без явного forall with имеют поведение по умолчанию (unscoped).

иначе a внутри функции находится другой a (изменен на a1 компилятором), чем тот, что в сигнатуре основного типа. Он не может сделать вывод, что a1 ограничивается только контекстом, который какой-то другой тип a ограничена.

второй пример работает, потому что Int не является переменной типа, это конкретный тип, что означает, что он относится к одному и тому же типу независимо от того, какие переменные типа находятся или не находятся в области.

Более Дальнеишее Чтение