Вам нужно добавить эту строку в начало вашего файла:
{-# LANGUAGE ScopedTypeVariables #-}
Если это расширение не включено, maxBound :: a
не относится к тому же a
, что и в классе.
По сути, в стандартном Haskell каждая сигнатура типа имеет свои собственные переменные типа, которые не зависят от любой другой переменной.Например, этот код
foo :: [a] -> Int
foo xs = length ys
where
ys :: [a]
ys = xs
терпит неудачу , поскольку ys :: [a]
действительно означает ys :: [b]
с независимой переменной b
, а ys = xs
не создает [b]
.
При включенном расширении компилируется:
foo :: forall a . [a] -> Int
foo xs = length ys
where
ys :: [a]
ys = xs
Возможно, должно быть другое значение по умолчанию, например, расширение должно быть включено по умолчанию.В качестве альтернативы, GHC должен намекнуть на включение расширения, когда один и тот же a
используется дважды, так как часто это проблема.