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