Ваше деление терпит неудачу, потому что ваше усечение терпит неудачу перед этим. У вас есть
tens :: Int -> Integer
tens (n :: Int) :: Integer
r * tens n :: Integer
r :: Integer
truncate :: ( RealFrac a, Integral b) => a -> b
truncate (r * tens n :: RealFrac Integer => Integer) :: Integral b => b
, то есть ваш код говорит, что в области видимости должен быть экземпляр RealFrac Integer
. Но это не то, о чем говорит сообщение об ошибке.
Обычно мы усекаем числа с плавающей запятой, чтобы получить всю их часть в виде значения типа Integral
, но аргумент r * tens n
уже является целое число.