normalize x :: M s a = -- ...
Это просто неправильно. Нет смысла объявлять тип возвращаемого значения в таком определении, вы уже объявили его в сигнатуре типа в строке ранее. И на самом деле это не является синтаксически допустимым и причиной, по которой вы получаете ошибку разбора.
Однако, как только вы исправите ошибку разбора (удалив :: M s a
), она все равно не будет работать, потому что вы еще не используете переменные типа scoped:
Чтобы использовать расширение переменных типа scoped, необходимо явно объявить переменные типа с помощью ключевого слова forall
. Фиксированное определение будет выглядеть так:
normalize :: forall s a. (Modular s a, Integral a) => a -> M s a
normalize x = M (x `mod` (modulus (undefined :: s)))